Hibernate中的Criteria的认识
在深入探讨Hibernate框架中Criteria API的使用之前,我们先简要了解一下Hibernate本身。Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java应用程序与数据库之间的交互过程,通过将对象模型映射到数据库结构上,实现了数据持久化操作而无需编写复杂的SQL语句。 ### Criteria API简介 Criteria是Hibernate提供的一个查询API,它允许开发人员以面向对象的方式构建查询,而不是直接写SQL语句。Criteria API基于CriteriaQuery接口,提供了丰富的查询选项,包括排序、分页、聚合函数等,这使得开发者能够更加灵活地进行数据检索。 ### 使用Criteria进行基本查询 在给定的部分内容中,首先展示的是如何使用Criteria进行排序查询。例如,如果想获取用户列表并按照年龄升序排列,可以这样实现: ```java Criteria criteria = session.createCriteria(User.class); criteria.addOrder(Order.asc("age")); List<User> users = criteria.list(); ``` 这里,`createCriteria`方法用于创建一个Criteria实例,指定查询的目标实体类为`User`。然后,通过调用`addOrder`方法添加排序规则,其中`Order.asc`表示按升序排序。调用`list`方法执行查询并返回结果列表。 ### 分页查询 Criteria还支持分页查询,这对于处理大量数据时特别有用。可以通过调用`setFirstResult`和`setMaxResults`方法来设置分页参数: ```java Criteria criteria = session.createCriteria(User.class); criteria.setFirstResult(51); // 设置起始位置为第51条记录 criteria.setMaxResults(50); // 设置每页显示50条记录 List<User> users = criteria.list(); ``` 这会生成类似于SQL的`LIMIT`子句的查询,从而实现对数据的分页。 ### 聚合函数 除了基本的查询功能外,Criteria API还支持各种聚合函数,如求平均值、计数、最大值、最小值等。例如,要计算所有用户的平均年龄,可以这样操作: ```java Criteria criteria = session.createCriteria(User.class); criteria.setProjection(Projections.avg("age")); // 设置投影为计算平均年龄 List<?> users = criteria.list(); // 注意:由于返回的是单个聚合值,所以这里返回的是List<?>类型 ``` 这里的`setProjection`方法用于设置投影,即指定查询返回哪些列或计算结果。`Projections.avg`表示计算平均值。 ### 分组查询 对于需要对数据进行分组统计的情况,Criteria API提供了`groupProperty`方法: ```java Criteria criteria = session.createCriteria(User.class); criteria.setProjection(Projections.groupProperty("age")); // 设置按年龄分组 List<?> users = criteria.list(); ``` 这会生成类似SQL中的`GROUP BY`子句的查询,对数据进行分组统计。 ### 复杂查询和条件过滤 当需要执行更复杂的查询,比如包含条件过滤的查询时,可以利用`Restrictions`和`Example`。例如,如果要查找与特定用户具有相同属性的其他用户,可以使用`Example`: ```java User user = new User(); user.setAge(30); Criteria criteria = session.createCriteria(User.class); criteria.add(Example.create(user)); // 添加示例对象作为查询条件 List<User> users = criteria.list(); ``` 这里,`Example.create`方法用于创建一个示例对象,它将被用作查询条件,查找数据库中与该示例对象匹配的所有记录。 通过上述介绍,我们可以看到,Hibernate的Criteria API提供了一个强大且灵活的数据查询解决方案,它不仅支持基本的查询需求,还能处理复杂的查询场景,如排序、分页、聚合函数、分组统计以及条件过滤等。这使得开发人员能够以更加面向对象的方式进行数据库操作,提高了代码的可读性和维护性。
使用Criteria进行查询时,不仅仅能组合出SQL中where子句的功能,还可以组合出如排序、统计、分组等的查询功能。这就是Criteria进阶查询。
排序
您可以使用Criteria进行查询,并使用org.hibernate.criterion.Order对结果进行排序,例如使用Oder.asc(),指定根据”age”由小到大排序(反之则使用desc()):
Criteria criteria = session.createCriteria(User.class);
criteria.addOrder(Order.asc("age"));
List users = criteria.list();
注意在加入Order条件时,使用的是addOrder()方法,而不是add()方法,在产生SQL语句时,会使用order by与asc(desc)来进行排序指定:
Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ order by this_.age asc
限定查询笔数
Criteria的setMaxResults()方法可以限定查询回来的笔数,如果配合setFirstResult()设定传回查询结果第一笔资料的位置,就可以实现简单的分页,例如传回第51笔之后的50笔资料(如果有的话):
Criteria criteria = session.createCriteria(User.class);
criteria.setFirstResult(51);
criteria.setMaxResults(50);
List users = criteria.list();
根据您所指定得资料库,Hibernate将自动产生与资料库相依的限定笔数查询子句,例如在MySQL中,将使用limit产生以下的SQL语句:
Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ limit ?, ?
统计动作
您可以对查询结果进行统计动作,使用 org.hibernate.criterion.Projections的avg()、rowCount()、count()、max()、min ()、 countDistinct()等方法,再搭配Criteria的setProjection()方法加入条件设定,例如对查询结果的"age"作平均:
Criteria criteria = session.createCriteria(User.class);
criteria.setProjection(Projections.avg("age"));
List users = criteria.list();
- 粉丝: 0
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助