`

Criteria 进阶查询,包括分组,统计和排序等

阅读更多
您可以使用Criteria进行查询,并使用Order对结果进行排序,例如使用Oder.asc()由小到大排序(反之则使用desc()):

Criteria criteria = session.createCriteria(User.class);

criteria.addOrder(Order.asc("age"));

List users = criteria.list()
;

setMaxResults()方法可以限定查询回来的笔数,如果配合setFirstResult()设定传回查询结果第一笔资料的位置,就可以实现简单的分页,例如传回第51笔之后的50笔资料(如果有的话):

Criteria criteria = session.createCriteria(User.class);

criteria.setFirstResult(51);

criteria.setMaxResult(50);

List users = criteria.list();


您可以对查询结果进行统计动作,使用Projections的avg()、rowCount()、count()、max()、min()、 countDistinct()等方法,例如对查询结果的"age"作平均:

Criteria criteria = session.createCriteria(User.class);

criteria.setProjection(Projections.avg("age"));

List users = criteria.list();

Iterator iterator =  users.iterator();

while(iterator.hasNext()) {

    System.out.println(iterator.next());      

}

还可以配合Projections的groupProperty()来对结果进行分组,例如以"age"进行分组,也就是如果资料中"age"如果有 20、20、25、30,则以下会显示20、25、30:

Criteria criteria = session.createCriteria(User.class);

criteria.setProjection(Projections.groupProperty("age"));

List users = criteria.list();

Iterator iterator =  users.iterator();

while(iterator.hasNext()) {

    System.out.println(iterator.next());      

}

如果想结合统计与分组功能,则可以使用ProjectionList,例如下面的程式会计算每个年龄各有多少个人:

ProjectionList projectionList = Projections.projectionList();

projectionList.add(Projections.groupProperty("age"));

projectionList.add(Projections.rowCount());

Criteria criteria = session.createCriteria(User.class);

criteria.setProjection(projectionList);

List users = criteria.list();

Iterator iterator =  users.iterator();

while(iterator.hasNext()) {

    Object[] o = (Object[]) iterator.next();

    System.out.println(o[0] + "\t" + o[1]);

}


如果有一个已知的物件,则可以根据这个物件作为查询的依据,看看是否有属性与之类似的物件,例如:

User user = new User();

user.setAge(new Integer(30));

Criteria criteria = session.createCriteria(User.class);

criteria.add(Example.create(user));

List users = criteria.list();

Iterator iterator =  users.iterator();

System.out.println("id \t name/age");

while(iterator.hasNext()) {

    User ur = (User) iterator.next();

    System.out.println(ur.getId() +

                                " \t " + ur.getName() +

                                "/" + ur.getAge());           

}


在这个例子中,user物件中有已知的属性"age"为30,使用Example会自动过滤掉user的空属性,并以之作为查询的依据,也就是找出 "age"同为30的资料。

Criteria可以进行复合查询,即在原有的查询基础上再进行查询,例如在Room对User的一对多关联中,在查询出所有的Room资料之后,希望再查询users中"age"为30的user资料:

Criteria roomCriteria = session.createCriteria(Room.class);

Criteria userCriteria = roomCriteria.createCriteria("users");

userCriteria.add(Restrictions.eq("age", new Integer(30)));

List rooms = roomCriteria.list(); // 只列出users属性中有user之"age"为30的Room

Iterator iterator = rooms.iterator(); 
分享到:
评论

相关推荐

    hibernate criteria 分组 排序 关联

    ### Hibernate Criteria 分组、排序与关联查询详解 #### 标题与描述理解 - **标题**:“hibernate criteria 分组 排序 关联”这一标题明确了本文将围绕Hibernate Criteria API进行分组、排序以及关联查询的具体...

    进阶查询herbinate

    在标题和描述中提到的“进阶查询herbinate”实际上是指使用Hibernate的Criteria API进行高级查询,包括分组、统计和排序等功能。 首先,我们可以使用`Criteria`来创建一个查询对象,然后通过`addOrder()`方法添加...

    Hibernate Criteria 排序的問題

    ### Hibernate Criteria 排序问题详解 #### 一、前言 在使用Hibernate进行数据库操作时,经常...通过掌握这些知识点,开发者可以更加灵活高效地使用Hibernate Criteria API来进行数据查询和排序操作,提高开发效率。

    Criteria连表查询

    Hibernate中的Criteria连表查询,包括单表属性查询,多表内连,以及左外连接查询

    Criteria标准化对象查询小例子

    4. **添加排序和分组**: 如果需要,可以使用Order和GroupBy来设置查询的排序和分组规则。 5. **执行查询**: 将所有的条件和设置传递给EntityManager的createQuery()方法,然后调用getResultList()或getSingleResult...

    Hibernate-Criteria 模糊查询

    Hibernate作为一款优秀的Java持久层框架,提供了多种方式来进行数据库操作,其中包括HQL(Hibernate Query Language)、Criteria API以及Native SQL等。其中,Criteria API由于其简洁的API设计和强大的查询能力,受...

    hibernateCriteria查询

    查询条件是通过`org.hibernate.criterion.Restrictions` 类来定义的,这个类提供了许多静态方法来模拟SQL语句中的条件,例如`eq` (等于)、`gt` (大于)、`in` (包含在列表中)等。 #### 三、简单Criteria查询示例 ...

    Hibernate-Criteria_模糊查询

    Criteria API基于面向对象的方式进行查询构建,可以动态地添加各种查询条件,包括等值比较、范围查询、模糊查询等,使得查询操作更加直观和易于管理。 ### 模糊查询的意义 模糊查询是数据库操作中常见的一种需求,...

    Hibernate_Criteria条件查询数据

    这个实例就是构建查询的起点,你可以添加各种限制条件、排序规则以及分组条件等。 2. **添加限制条件**:Criteria查询支持多种条件表达式,如` Restrictions.eq()`(等于)、`Restrictions.ne()`(不等于)、`...

    09 Criteria查询方式

    4. **添加分组**:对于需要分组的查询,可以使用Criteria的setGroupBy()方法。 5. **执行查询**:最后,调用Criteria的list()或uniqueResult()方法执行查询,得到查询结果。 举个例子,如果我们有一个User实体类,...

    hibernate如何使用criteria联合查询 group by 的语句

    这个案例是根据分组查询,并且得到每组的条数,不懂得可以q我:1710086675,欢迎认识更多新朋友

    Hibernate中Criteria的使用

    Projection 主要用于报表查询,可以实现分组和统计查询。 Criterion 接口的主要实现包括:Example、Junction 和 SimpleExpression。Junction 的实际使用是它的两个子类 conjunction 和 disjunction,分别是使用 AND...

    Criteria hibernate

    Criteria API也支持分组和聚合操作。通过调用setGroupBy()方法进行分组,使用Projections类的聚合函数,如count(), max(), min()等。 6. **关联查询(Joins)** Hibernate Criteria API允许进行关联查询,包括内...

    Hibernate criteria基本操作

    Criteria API 提供了多种方法来构建复杂的查询,包括添加条件、排序、分页以及使用统计函数等。 1. 创建 Criteria 对象: ```java Criteria criteria = session.createCriteria(Guestbook.class); ``` 这个语句...

    Hibernate中,利用Criteria查询容器实现sql的写法

    此外,它支持连接查询(join)、分组(group by)和Having条件,可以实现复杂的查询逻辑。 标签中提到的"源码"和"工具",意味着在深入学习Criteria API时,了解其底层实现和与其他工具(如IDE插件)的集成也是很...

    Hibernate中Criteria的完整用法.docx

    Projection 主要是让 Criteria 能够进行报表查询,并可以实现分组。Projection 主要有 SimpleProjection、ProjectionList 和 Property 三个实现。其中 SimpleProjection 和 ProjectionList 的实例化是由内建的 ...

    Hibernate的Criteria用法总结.doc

    Criteria 还提供了其他一些有用的用法,如设置 FetchMode(联合查询抓取的模式)、设置排序方式、设置 FlushModel(冲刷 Session 的方式)和 LockMode(数据库锁模式)。通过这些设置,可以满足复杂的查询需求。 ...

    Hibernate中Criteria的完整用法

    其中 SimpleProjection 和 ProjectionList 的实例化是由内建的 Projections 来完成,如提供的 avg、count、max、min、sum 可以让开发者很容易对某个字段进行统计查询。 Property 是对某个字段进行查询条件的设置,...

Global site tag (gtag.js) - Google Analytics