Criteria Query通过面向对象化的设计,将数据查询条件封装为一个对象。简单来
讲,Criteria Query可以看作是传统SQL的对象化表示,如:
Criteria criteria = session.createCriteria(User.class);
criteria.add(Expression.eq("name","Erica"));
criteria.add(Expression.eq("sex",new Integer(1)));
这里的criteria 实例实际上是SQL “Select * from t_user where
name=’Erica’ and sex=1”的封装(我们可以打开Hibernate 的show_sql 选项,
以观察Hibernate在运行期生成的SQL语句)。
Hibernate 在运行期会根据Criteria 中指定的查询条件(也就是上面代码中通过
criteria.add方法添加的查询表达式)生成相应的SQL语句。
这种方式的特点是比较符合Java 程序员的编码习惯,并且具备清晰的可读性。正因
为此,不少ORM实现中都提供了类似的实现机制(如Apache OJB)。
对于Hibernate的初学者,特别是对SQL了解有限的程序员而言,Criteria Query
无疑是上手的极佳途径,相对HQL,Criteria Query提供了更易于理解的查询手段,借
助IDE的Coding Assist机制,Criteria的使用几乎不用太多的学习。
Criteria 查询表达式
Criteria 本身只是一个查询容器,具体的查询条件需要通过Criteria.add
方法添加到Criteria实例中。
如前例所示,Expression 对象具体描述了查询条件。针对SQL 语法,
Expression提供了对应的查询限定机制,包括:
方法 描述
Expression.eq 对应SQL“field = value”表达式。
如Expression.eq("name","Erica")
Expression.allEq 参数为一个Map对象,其中包含了多个属性-值对
应关系。相当于多个Expression.eq关系的叠加。
Expression.gt 对应SQL中的 “field > value ” 表达式
Expression.ge 对应SQL中的 “field >= value” 表达式
Expression.lt 对应SQL中的 “field < value” 表达式
Expression.le 对应SQL中的 “field <= value” 表达式
Expression.between 对应SQL中的 “between” 表达式
如下面的表达式表示年龄(age)位于13到50区间内。
Expression.between("age",new
Integer(13),new Integer(50));
表达式
Expression.in 对应SQL中的 ”field in …” 表达式
Expression.eqProperty 用于比较两个属性之间的值,对应SQL中的“field = field”。
如:
Expression.eqProperty(
"TUser.groupID",
"TGroup.id"
);
Expression.gtProperty 用于比较两个属性之间的值,对应SQL中的“field > field”。
Expression.geProperty 用于比较两个属性之间的值,对应SQL中的“field >= field”。
Expression.ltProperty 用于比较两个属性之间的值,对应SQL中的“field < field”。
Expression.leProperty 用于比较两个属性之间的值,对应SQL中的“field <= field”。
Expression.and and关系组合。
如:
Expression.and(
Expression.eq("name","Erica"),
Expression.eq(
"sex",
new Integer(1)
)
);
Expression.or or关系组合。
如:
Expression.or(
Expression.eq("name","Erica"),
Expression.eq("name","Emma")
);
Expression.sql 作为补充,本方法提供了原生SQL语法的支持。我
们可以通过这个方法直接通过SQL语句限定查询条件。
下面的代码返回所有名称以“Erica”起始的记录:
Expression.sql(
“lower({alias}.name) like lower(?)”,
"Erica%",
Hibernate.STRING
);
其中的“{alias}”将由Hibernate在运行期使
用当前关联的POJO别名替换。
注意Expression 各方法中的属性名参数(如Express.eq中的第一个参数),这里
所谓属性名是POJO中对应实际库表字段的属性名(大小写敏感),而非库表中的实
际字段名称。
Criteria 高级特性
限定返回的记录范围
通过criteria. setFirstResult/setMaxResults 方法可以限制一次查询返回
的记录范围:
Criteria criteria = session.createCriteria(TUser.class);
//限定查询返回检索结果中,从第一百条结果开始的20条记录
criteria.setFirstResult(100);
criteria.setMaxResults(20);
对查询结果进行排序
//查询所有groupId=2的记录
//并分别按照姓名(顺序)和groupId(逆序)排序
Criteria criteria = session.createCriteria(TUser.class);
criteria.add(Expression.eq("groupId",new Integer(2)));
criteria.addOrder(Order.asc("name"));
criteria.addOrder(Order.desc("groupId"));
Criteria作为一种对象化的查询封装模式,不过由于Hibernate在实现过程中将精力
更加集中在HQL查询语言上,因此Criteria的功能实现还没做到尽善尽美(这点上,OJB
的Criteria 实现倒是值得借鉴),因此,在实际开发中,建议还是采用Hibernate 官
方推荐的查询封装模式:HQL。
分享到:
相关推荐
### Hibernate-Criteria 模糊查询详解 在Java的持久化技术中,Hibernate作为ORM(对象关系映射)框架的一种,提供了强大的数据访问能力。而其中的`Criteria`接口更是为复杂的查询需求提供了一种灵活且功能强大的...
- **Hibernate配置**:理解实体类与数据库表的关系,以及如何使用HQL或 Criteria API 进行查询。 - **安全实践**:研究如何使用Spring Security保护敏感资源,如登录接口,防止SQL注入和跨站脚本攻击(XSS)。 - **...
在深入探讨Hibernate与Criteria结合进行模糊查询之前,我们先来了解一下Hibernate和Criteria的基本概念,以及为何选择使用它们进行模糊查询。 ### Hibernate简介 Hibernate是一个开放源代码的对象关系映射(ORM)...
《深入理解Hibernate JPA 2.1 API》 在Java世界中,ORM(Object-Relational Mapping)框架已经成为开发数据库应用程序不可或缺的一部分。其中,Hibernate作为一款功能强大的ORM框架,极大地简化了Java对象与数据库...
Hibernate,作为Java领域最著名的对象关系映射(ORM)框架之一,自诞生以来就深受开发者喜爱。本次我们聚焦于`hibernate-release-4.3.10.Final`版本,这是一个稳定且功能丰富的版本,为开发者提供了强大的数据持久化...
《udemy-jpa-with-hibernate》课程资源是一个深入学习Java持久化层技术JPA(Java Persistence API)和ORM(Object-Relational Mapping)框架Hibernate的综合教程。通过这个课程,初学者可以逐步掌握如何在实际项目中...
5. **Query**:提供了HQL(Hibernate Query Language)和Criteria API,允许以面向对象的方式执行数据库查询。 四、源码分析 深入源码,我们可以看到以下关键部分: - `Configuration`类:负责读取和解析...
DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> ...
- **链接**: `http://www.java2java.com/CN/Tutorial/Java/0350__Hibernate/0260__Criteria.htm` - **说明**: Criteria API是Hibernate提供的高级查询API之一,它提供了灵活的方式来构建查询条件。 ##### (3) 主键...
《Hibernate 4.3.9.Final:持久化框架的核心技术与实践》 Hibernate,作为Java领域中的一个著名ORM(对象关系映射)框架,它极大地简化了数据库操作,使得开发者能够以面向对象的方式来处理数据库交互。这次我们...
为了提升性能,Hibernate提供了多种优化手段,如:批处理(Batch Processing)、预加载(Preloading)、缓存策略调整、避免N+1查询问题等。理解并运用这些技巧,可以在保证代码简洁的同时,提升应用性能。 通过深入...
它包含了对JPA(Java Persistence API)的实现,以及Hibernate特有的特性,如 Criteria 查询、HQL(Hibernate Query Language)等。 2. **hibernate-entitymanager**: 用于支持JPA规范,提供实体管理和事务处理。...
同时,Hibernate提供了HQL(Hibernate Query Language)和Criteria API等高级查询方式,使得查询更加灵活和强大。 总的来说,这个压缩包是Hibernate的一个完整发行版,包含所有必要的组件,适合于基于SSH框架的Java...
JPA还支持更复杂的查询语言JPA Query Language (JPQL) 和 Criteria API,提供更灵活的查询方式。 ### 5. 批量操作与缓存 JPA提供了批量操作的方法,如`em.flush()`用于提交当前实体管理器的所有更改到数据库,`em....
- Criteria API:提供了一种更灵活、更类型安全的方式来执行查询,替代了传统的HQL(Hibernate Query Language)。 - Object-Relational Mapping:通过XML或注解方式定义实体类和数据库表之间的映射关系,实现对象...
Hibernate HQL(Hibernate Query Language)或JPA(Java Persistence API)的Criteria API可以用来执行复杂的查询操作。 8. **测试**:Spring Test和Hibernate Test支持可以帮助我们编写单元测试和集成测试,确保...
它不仅提供了JPA规范的所有功能,还额外扩展了一些特性,如更强大的查询语言HQL(Hibernate Query Language)和 Criteria API,以及对事务和缓存的管理。 3. **3.3.0.GA版本特点** - **稳定性**:3.3.0.GA是一个...
首先,Hibernate-JPA 2.1 API 是Hibernate对Java Persistence 2.1规范的实现,它提供了一系列接口和类,使得开发者可以方便地进行实体管理、查询、事务控制等操作。`1.0.0.Final`版本意味着这是一个稳定版本,适合...