hibernate -- Criteria查询

待我称王封你为后i 2021-09-26 12:28 486阅读 0赞

如何使用

查所有

复制代码

  1.   /**
  2. * 作用:查所有
  3. * 说明:通过list(),返回的是实体对象集合
  4. */
  5. @Test
  6. public void test1(){
  7. //创建连接
  8. Session session = HibernateUtil.getCurrentSession();
  9. //开启事务
  10. Transaction tx = session.beginTransaction();
  11. //创建criteria
  12. Criteria criteria = session.createCriteria(User.class, "u");
  13. //业务
  14. List<User> list = criteria.list();
  15. for (User user : list) {
  16. System.out.println(user);
  17. }
  18. //关闭事务
  19. session.close();
  20. }

复制代码

条件查询

  1)一个条件

复制代码

  1. /**
  2. * 作用:or()用法
  3. * 说明:通过or()返回的是实体对象集合
  4. * add(Criterion criterion)用来添加查询条件
  5. * Restrictions通过内置的静态方法,可以创建criterion
  6. */
  7. //创建criteria
  8. Criteria criteria = session.createCriteria(User.class, "u");
  9. //业务:查询出id为1或为2的用户
  10. List<User> list = criteria.add(Restrictions.or(Restrictions.eq("id", 1),
  11. Restrictions.eq("id", 2) ))
  12. .list();

复制代码

  2)多个条件

复制代码

  1.   /**
  2. * 作用:多个条件:like()和gt()的用法
  3. */
  4. //创建criteria
  5. Criteria criteria = session.createCriteria(User.class, "u");
  6. //业务:查询出id大于1,名字中带ji的用户
  7. List<User> list = criteria.add(Restrictions.like("name","%ji%"))
  8. .add(Restrictions.gt("id", 1))
  9. .list();

复制代码

其他的条件就不一一测试了,下面列出常用的Restrictions方法

复制代码

  1.   Restrictions.eq 等于
  2.   Restrictions.allEq 使用Map,使用key/value进行多个等于的比对
  3.   Restrictions.gt 大于 >
  4.   Restrictions.ge 大于等于 >=
  5.   Restrictions.lt 小于 <
  6.   Restrictions.le 小于等于 <=
  7.   Restrictions.between 对应SQLBETWEEN子句
  8.   Restrictions.like 对应SQLLIKE子句
  9.   Restrictions.in 对应SQLin子句
  10.   Restrictions.and and关系
  11.   Restrictions.or or关系

复制代码

排序

复制代码

  1.   /**
  2. * 作用:排序
  3. * 说明:通过addOrder()添加排序条件
  4. * Order设置排序规则,desc是降序,asc是升序
  5. */
  6. //创建criteria
  7. Criteria criteria = session.createCriteria(User.class, "u");
  8. //业务:对查询结果,根据id排序
  9. List<User> list = criteria.addOrder(Order.desc("id"))
  10. .list();

复制代码

关联

参考 : http://blog.csdn.net/bestlxm/article/details/6735464  

User实体类中有关系属性orders,

数据库中的数据如下:order表中的外键是user_id

  user表:

979016-20160730211149200-1785355716.png

  1. order表:

979016-20160730211440856-1602921359.png

代码如下:

复制代码

  1. /**
  2. * 作用:关联
  3. * 说明:通过createAlias()设置关系属性
  4. * 对已定义关联关系的,我们可以使用createAlias()来创建属性的别名,然后引用别名进行条件查询,如:
  5. 这样进行查询时就可得到关联查询后的Parent对象结果集,本例中,User是Parent类
  6. *
  7. * Hibernate打印sql语句如下:
  8. * select
  9. this_.id as id0_1_,
  10. this_.age as age0_1_,
  11. this_.birth as birth0_1_,
  12. this_.name as name0_1_,
  13. o1_.id as id1_0_,
  14. o1_.note as note1_0_,
  15. o1_.price as price1_0_
  16. from
  17. user50 this_
  18. inner join
  19. order50 o1_
  20. on this_.id=o1_.user_id
  21. where
  22. o1_.id = ?
  23. * 控制台打印如下:
  24. * User [userID=1, name=zhangjifeng, age=18, birthday=2016-07-26]
  25. */
  26. @Test
  27. public void test5(){
  28. //创建连接
  29. Session session = HibernateUtil.getCurrentSession();
  30. //开启事务
  31. Transaction tx = session.beginTransaction();
  32. //创建criteria
  33. Criteria criteria = session.createCriteria(User.class, "u");
  34. //业务:
  35. List<User> list = criteria.createAlias("orders","o")
  36. .add(Restrictions.eq("o.id", 1))
  37. .list();
  38. for (User user : list) {
  39. System.out.println(user);
  40. }
  41. //关闭事务
  42. session.close();
  43. }

复制代码

关联2:createCriteria()

测试代码如下

复制代码

  1.   /**
  2. * 第二个createCriteria(),返回的是一个新的实例
  3. * 打印出user和order
  4. */
  5. @Test
  6. public void test6(){
  7. //创建连接
  8. Session session = HibernateUtil.getCurrentSession();
  9. //开启事务
  10. Transaction tx = session.beginTransaction();
  11. //创建criteria
  12. Criteria criteria = session.createCriteria(User.class, "u");
  13. //业务:
  14. List list = criteria.createCriteria("orders","o")
  15. .add(Restrictions.eq("o.id", 1))
  16. .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)
  17. .list();
  18. Iterator iterator = list.iterator();
  19. while (iterator.hasNext()) {
  20. Map map = (Map)iterator.next();
  21. // Set keySet = map.keySet();
  22. Set entrySet = map.entrySet();
  23. Iterator iterator2 = entrySet.iterator();
  24. while(iterator2.hasNext()){
  25. Map.Entry<String, Object> map1 =(Entry<String, Object>) iterator2.next();
  26. System.out.println(map1.getValue());
  27. }
  28. }
  29. //关闭事务
  30. session.close();
  31. }

复制代码

Projections投影

1)将结果集中的结果当做行和列集来使用,这与通过JDBC执行select查询获得的数据的使用方式相似。因此,Hibernate也支持属性、统计函数和Group By等查询。

2)要想使用Hibernate的投影统计功能,首先要从org.hibernate.criterion.Projections工厂类获得org.hibernate.criterion.Projection对象

3)Hibernate的Projections工厂类包含了以下几个常用的统计函数:

    ① avg(String propertyName):计算属性字段的平均值。

    ② count(String propertyName):统计一个属性在结果中出现的次数。

    ③ countDistinct(String propertyName):统计属性包含的不重复值的数量。

    ④ max(String propertyName):计算属性值的最大值。

    ⑤ min(String propertyName):计算属性值的最小值。

    ⑥ sum(String propertyName):计算属性值的总和。

代码如下:

复制代码

  1. /**
  2. * 投影:Projections
  3. * 统计,重复
  4. */
  5. @Test
  6. public void test8(){
  7. //创建连接
  8. Session session = HibernateUtil.getCurrentSession();
  9. //开启事务
  10. Transaction tx = session.beginTransaction();
  11. //创建criteria
  12. Criteria criteria = session.createCriteria(Order.class, "o");
  13. //业务:
  14. List<Object[]> list = criteria.setProjection(Projections.projectionList()
  15. .add(Projections.max("price"))
  16. .add(Projections.min("price"))
  17. .add(Projections.avg("price"))
  18. .add(Projections.countDistinct("note")) )
  19. .list();
  20. for (Object[] objects : list) {
  21. for (Object object : objects) {
  22. System.out.println(object);
  23. }
  24. }
  25. //关闭事务
  26. session.close();

复制代码

获得的结果是单独的属性而不是实体类。例如,一个产品表中包含有很多字段,我们想要获取产品表中的名称和描述,而不需要将完整的实体加载到内存中

复制代码

  1.   /**
  2. * 投影:Projections
  3. * 获取部分字段
  4. */
  5. @Test
  6. public void test9(){
  7. //创建连接
  8. Session session = HibernateUtil.getCurrentSession();
  9. //开启事务
  10. Transaction tx = session.beginTransaction();
  11. //创建criteria
  12. Criteria criteria = session.createCriteria(Order.class, "o");
  13. //业务:
  14. ProjectionList projList = Projections.projectionList();
  15. projList.add(Projections.property("name"));
  16. projList.add(Projections.property("price"));
  17. criteria.setProjection(projList);
  18. List result = criteria.list();
  19. for (Object object : result) {
  20. System.out.println(object);
  21. }
  22. //关闭事务
  23. session.close();
  24. }

发表评论

表情:
评论列表 (有 0 条评论,486人围观)

还没有评论,来说两句吧...

相关阅读