测试数据库如下
t_sort表: t_good表:
一、对象导航方式查询
查询所有食品类下面的食品
代码:
//对象导航查询 @Test public void Test1(){ SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { sessionFactory = HibernateUtils.getFactory(); session = sessionFactory.openSession(); tx = session.beginTransaction(); //1、使用get方法查询出食品类 Sort food = session.get(Sort.class, 1); //2、使用sort对象的方法得到所有食品类中的食品 Set<Good> set = food.getSetGoods(); //3、遍历set集合 for (Good good : set) { System.out.println(good); } tx.commit(); } catch (Exception e) { tx.rollback(); }finally{ session.close(); sessionFactory.close(); } }
查询结果:
二、OID查询
OID查询就是根据id查询某一条记录
代码
//OID查询方式 @Test public void Test2(){ SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { sessionFactory = HibernateUtils.getFactory(); session = sessionFactory.openSession(); tx = session.beginTransaction(); //OID查询就是使用get方法查询出一条记录 Sort food = session.get(Sort.class, 1); System.out.println(food); tx.commit(); } catch (Exception e) { tx.rollback(); }finally{ session.close(); sessionFactory.close(); } }
结果
三、HQL查询
hql查询是使用Hibernate Query Language进行的一种查询方式,在这种查询方式中必须要写hql语句才能查询。
1、查询所有
查询所有的hql语句格式为:from 实体类名称(以查询所有商品为例)
代码:
// HQL查询所有。查询所有商品为例 @Test public void Test3() { SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { sessionFactory = HibernateUtils.getFactory(); session = sessionFactory.openSession(); tx = session.beginTransaction(); // 1、得到Query对象,并写入hql语句 Query query = session.createQuery("from Good"); //2、使用Query对象的list方法得到数据集合 List<Good> list = query.list(); //3、遍历集合获取数据 for (Good good : list) { System.out.println(good); } tx.commit(); } catch (Exception e) { tx.rollback(); } finally { session.close(); sessionFactory.close(); } }
测试结果:
2、条件查询
条件查询有准确查询和模糊查询,使用hql语句完成。
(1)准确查询hql语句:from 实体类名 where 实体属性名 = ? and 实体类属性名 = ?。
准确查询代码:
// HQL准确条件查询。查询名字为面包,描述为奶油面包的记录 @Test public void Test4() { SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { sessionFactory = HibernateUtils.getFactory(); session = sessionFactory.openSession(); tx = session.beginTransaction(); // 1、得到Query对象,并写入hql语句 Query query = session.createQuery("from Good where gname = ? and gmono =?"); //2、填写上一步中占位符的内容 query.setParameter(0, "面包"); query.setParameter(1, "奶油面包"); //3、使用Query对象的list方法得到数据集合 List<Good> list = query.list(); //3、遍历集合获取数据 for (Good good : list) { System.out.println(good); } tx.commit(); } catch (Exception e) { tx.rollback(); } finally { session.close(); sessionFactory.close(); } }
查询结果:
(2)模糊查询hql语句:from 实体类名 where 实体类属性名 like ?。
模糊查询代码:
// HQL模糊条件查询。查询名字中有"手"字的记录 @Test public void Test5() { SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { sessionFactory = HibernateUtils.getFactory(); session = sessionFactory.openSession(); tx = session.beginTransaction(); // 1、得到Query对象,并写入hql语句 Query query = session.createQuery("from Good where gname like ?"); // 2、填写上一步中占位符的内容 query.setParameter(0, "%手%"); // 3、使用Query对象的list方法得到数据集合 List<Good> list = query.list(); // 3、遍历集合获取数据 for (Good good : list) { System.out.println(good); } tx.commit(); } catch (Exception e) { tx.rollback(); } finally { session.close(); sessionFactory.close(); } }
模糊查询结果:
3、排序查询
排序查询hql语句:正序: form 实体类名称 order by 实体类属性名 asc
倒序:from 实体类名称 order by 实体类属性名 desc
(1)正序查询代码
// HQL排序条件查询。gid正序查询 @Test public void Test6() { SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { sessionFactory = HibernateUtils.getFactory(); session = sessionFactory.openSession(); tx = session.beginTransaction(); // 1、得到Query对象,并写入hql语句 Query query = session.createQuery("from Good order by gid asc"); // 2、使用Query对象的list方法得到数据集合 List<Good> list = query.list(); // 3、遍历集合获取数据 for (Good good : list) { System.out.println(good); } tx.commit(); } catch (Exception e) { tx.rollback(); } finally { session.close(); sessionFactory.close(); } }
正序查询测试结果:
(2)倒序查询代码:
// HQL排序查询。gid倒序查询 @Test public void Test7() { SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { sessionFactory = HibernateUtils.getFactory(); session = sessionFactory.openSession(); tx = session.beginTransaction(); // 1、得到Query对象,并写入hql语句 Query query = session.createQuery("from Good order by gid desc"); // 2、使用Query对象的list方法得到数据集合 List<Good> list = query.list(); // 3、遍历集合获取数据 for (Good good : list) { System.out.println(good); } tx.commit(); } catch (Exception e) { tx.rollback(); } finally { session.close(); sessionFactory.close(); } }
倒序查询测试结果:
4、分页查询
在mysql数据库中分页使用limit实现,在Hibernate中使用Query对象的两个方法实现。
分页查询代码:
// HQL分页查询。每页3条数据查询 @Test public void Test8() { SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { sessionFactory = HibernateUtils.getFactory(); session = sessionFactory.openSession(); tx = session.beginTransaction(); // 1、得到Query对象,并写入hql语句 Query query = session.createQuery("from Good"); //2、使用Query的方法实现分页 //2.1设置第一个要查询的位置(计算公式:(当前页数-1)*每页的记录数) query.setFirstResult(0); //2.2设置每页显示的最大记录数 query.setMaxResults(3); // 2、使用Query对象的list方法得到数据集合 List<Good> list = query.list(); // 3、遍历集合获取数据 for (Good good : list) { System.out.println(good); } tx.commit(); } catch (Exception e) { tx.rollback(); } finally { session.close(); sessionFactory.close(); } }
测试结果:
5、投影查询
投影查询概念:查询的不是表中的所有字段,而是一部分字段
代码:
// HQL投影查询。查询Good的name @Test public void Test9() { SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { sessionFactory = HibernateUtils.getFactory(); session = sessionFactory.openSession(); tx = session.beginTransaction(); // 1、得到Query对象,并写入hql语句 Query query = session.createQuery("select gname from Good"); //2、获取结果 List<Object> list =query.list(); for (Object object : list) { System.out.println(object); } tx.commit(); } catch (Exception e) { tx.rollback(); } finally { session.close(); sessionFactory.close(); } }
测试结果:
6、聚集函数查询
常用聚集函数:count avg max min sum
以count为例进行说明
hql语句:select count(*) from 实体类名称
代码:
// HQL投影查询。查询Good的name @Test public void Test10() { SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { sessionFactory = HibernateUtils.getFactory(); session = sessionFactory.openSession(); tx = session.beginTransaction(); // 1、得到Query对象,并写入hql语句 Query query = session.createQuery("select count(*) from Good"); //2、获取结果(结果为long类型) Object obj = query.uniqueResult(); //3、转化为long(类型为long,转为int会报错) Long long1 = (Long) obj; int count = long1.intValue(); System.out.println(count); tx.commit(); } catch (Exception e) { tx.rollback(); } finally { session.close(); sessionFactory.close(); } }
测试结果: