使用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();
上面的程式将由Hibernate自动产生SQL的avg函数进行平均计算:
Hibernate: select avg(this_.age) as y0_ from T_USER this_
分组
还可以配合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();
上面的程式将由Hibernate自动产生SQL的group by子句进行分组计算:
Hibernate: select this_.age as y0_ from T_USER this_ group by this_.age
如果想同时结合统计与分组功能,则可以使用org.hibernate.criterion.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();
观察所产生的SQL语句,将使用group by先进行分组,再针对每个分组进行count函数的计数,
Hibernate: select this_.age as y0_, count(*) as y1_ from T_USER this_ group by this_.age
根据已知物件进行查询
设定查询条件并非一定要使用Restrictions,如果属性条件很多,使用Restrictions也不方便,如果有一个已知的物件,则可以根据这个物件作为查询的依据,看看是否有属性与之类似的物件,例如:
-
User user = new User();
-
user.setAge(new Integer(30));
-
Criteria criteria = session.createCriteria(User.class);
-
criteria.add(Example.create(user));
-
List users = criteria.list();
Criteria进阶查询中,您可以透过 org.hibernate.criterion.Example的create()方法来建立Example实例,Example实作了 Criteria介面,因此可以使用add()方法加入至Criteria条件设定之中,Hibernate将自动过滤掉空属性,根据已知物件上已设定的属性,判定是否产生于where子句之中:
Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where (this_.age=?)
设定SQL范本
如果您了解如何撰写SQL语句,想要设定一些Hibernate产生SQL时的范本,您也可以使用Restrictions的sqlRestriction()方法,提供SQL语法范本作限定查询,例如查询name以cater开头的资料:
-
Criteria criteria = session.createCriteria(User.class);
-
criteria.add(Restrictions.sqlRestriction(
-
"{alias}.name LIKE (?)", "cater%", Hibernate.STRING));
-
List users = criteria.list();
其中alias将被替换为与User类别相关的名称,而? 将被替换为cater%,也就是第二个参数所提供的值,sqlRestriction()方法第一个参数所设定的是where子句的部份,所以在SQL撰写时,不必再写where,观察所产生的SQL语句,将使用您所设定的SQL范本作为基础,来完成SQL的条件查询:
Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where this_.name LIKE (?)
如果有多个查询条件,例如between子句的查询,则可以如下:
-
Criteria criteria = session.createCriteria(User.class);
-
Integer[] ages = {new Integer(20), new Integer(40)};
-
Type[] types = {Hibernate.INTEGER, Hibernate.INTEGER};
-
criteria.add(Restrictions.sqlRestriction(
-
"{alias}.age BETWEEN (?) AND (?)", ages, types));
-
List users = criteria.list();
观察所产生的SQL语句如下:
Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where this_.age BETWEEN (?) AND (?)
Criteria进阶查询就介绍到这里。
相关推荐
### Hibernate-Criteria 模糊查询详解 #### 一、引言 在软件开发过程中,数据库查询操作是非常常见的需求之一。Hibernate作为一款优秀的Java持久层框架,提供了多种方式来进行数据库操作,其中包括HQL(Hibernate ...
《Hibernate 进阶教程》是一本专为对Hibernate有初步了解并希望深入学习的开发者准备的手册。Hibernate作为Java领域中最流行的持久化框架之一,它极大地简化了数据库操作,使得开发者能够更专注于业务逻辑,而非繁琐...
4. ** Criteria API**:除了HQL,Hibernate还提供了Criteria API,它允许动态构建查询,避免硬编码查询字符串,增强了代码的可读性和安全性。 5. **Spring的Hibernate集成**:通过配置XML或Java配置,可以实现...
在标题和描述中提到的“进阶查询herbinate”实际上是指使用Hibernate的Criteria API进行高级查询,包括分组、统计和排序等功能。 首先,我们可以使用`Criteria`来创建一个查询对象,然后通过`addOrder()`方法添加...
了解如何优化Hibernate性能是进阶的关键,包括合理使用批处理、避免N+1查询、减少数据库访问次数等。 通过阅读`纯手写hibernate.txt`文档,观看`hibernate基础day01.wmv`视频,实践`hibernate-hand`中的示例,你...
查询语言在Hibernate中主要有两种:HQL(Hibernate Query Language)和 Criteria API。HQL是面向对象的查询语言,类似于SQL,但更接近于Java的语法。Criteria API则提供了一种动态构建查询的方式,更加灵活且类型...
4. 查询(Querying):Hibernate支持HQL(Hibernate Query Language)和Criteria API,它们是面向对象的查询方式,相比原生SQL更直观且易于维护。 在实际开发中,利用Hibernate Annotation可以轻松地实现以下功能:...
此外,还讲解了Criteria查询、HQL(Hibernate Query Language)和JPQL(Java Persistence Query Language)的语法和优势,这些强大的查询工具使开发者可以编写更加简洁和高效的代码。 综上所述,这三份文档全面覆盖...
5. **Criteria API** 和 **Query API**:提供了更现代、类型安全的查询方式,是Hibernate 4.0之后推荐的查询方式。 6. **第二级缓存**:支持缓存策略,提高应用程序性能。 7. **事务处理**:提供了对数据库事务的...
Hibernate是一款开源的...阅读Hibernate 3.1.2中文文档,不仅可以了解这些基本概念,还能深入学习到如检索策略、批处理、缓存优化等进阶主题,这对于任何希望掌握Hibernate或者ORM技术的Java开发者来说都是宝贵的资源。
9. **高级特性**:涵盖动态模型、多态性、集合元素类型、子查询、联合实体、继承策略等进阶主题,提升开发者对Hibernate的深入理解和运用能力。 10. **最佳实践与实战经验**:分享作者在实际项目中积累的Hibernate...
Querydsl是一个强大的查询工具,可以与Hibernate的Criteria API结合使用,提供更加强大的类型安全查询能力,避免运行时错误。 9. Hibernate缓存 Hibernate提供了缓存机制,包括一级缓存(Session级别的)和二级...
学习完基础后,可深入研究Hibernate的高级特性,如 Criteria API、Hibernate Search 和 JPA 规范等。 总之,"hibernate第一个hibernate"项目是一个绝佳的起点,它将引导你了解并掌握Hibernate的基本概念和操作。...
《Hibernate进阶之路:深入解析相关jar包》 在Java世界中,Hibernate作为一个优秀的对象关系映射(ORM)框架,极大地简化了数据库操作。本文将深入探讨与Hibernate进阶之路相关的jar包,帮助开发者理解这些核心组件...
- HQL(Hibernate Query Language):学习Hibernate的SQL方言,用于更方便地进行对象查询,包括基本查询、条件查询、聚合函数、分组、排序等。 - Criteria API:了解一种更加面向对象的查询方式,可以动态构建查询...
总结,“hibernate3.0立体文档”中的32个示例覆盖了Hibernate的基础和进阶应用,包括配置、映射、CRUD操作、查询、关联关系、事务和性能调优等方面,为初学者和开发者提供了丰富的学习资源。通过实践这些例子,能更...
通过以上讲解,我们可以看到,传智播客的Hibernate教程覆盖了从基础到进阶的各个方面,为初学者提供了全面的学习资源。掌握Hibernate能够极大地提升Java开发中的数据库操作效率,是Java开发者必备的技能之一。通过...
5. **Criteria查询**:除了传统的HQL(Hibernate Query Language)查询,Hibernate还提供了Criteria API进行动态查询,无需编写SQL,通过构建Criteria对象并添加各种限制条件,可以方便地执行复杂查询。 6. **Query...
12. 高级特性:包括 Criteria API、HQL、子查询、联合查询、存储过程、CGLIB和JPA集成等,这些都是深入理解和使用Hibernate时需要掌握的内容。 以上只是Hibernate基本概念和关键知识点的概述,具体到《Hibernate...