测试数据库如下:
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(); ???????????} ???????}
测试结果:
分享知识-快乐自己:Hibernate各种查询操作
原文地址:https://www.cnblogs.com/mlq2017/p/9860173.html