第 12 章 条件查询(Criteria Query)
现在Hibernate也支持一种直观的、可扩展的条件查询API。目前为止,这个API还没有更成熟的HQL查询那么强大,也没有那么多查询能力。特别要指出,条件查询也不支持投影(projection)或统计函数(aggregation)。
12.1. 创建一个Criteria实例
net.sf.hibernate.Criteria这个接口代表对一个特定的持久化类的查询。Session是用来制造Criteria实例的工厂。
Criteria crit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();
12.2. 缩小结果集范围
一个查询条件(Criterion)是net.sf.hibernate.expression.Criterion接口的一个实例。类net.sf.hibernate.expression.Expression定义了获得一些内置的Criterion类型。
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.between("weight", minWeight, maxWeight) )
.list();
表达式(Expressions)可以按照逻辑分组.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.add( Expression.or(
Expression.eq( "age", new Integer(0) ),
Expression.isNull("age")
) )
.list();
List cats = sess.createCriteria(Cat.class)
.add( Expression.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )
.add( Expression.disjunction()
.add( Expression.isNull("age") )
.add( Expression.eq("age", new Integer(0) ) )
.add( Expression.eq("age", new Integer(1) ) )
.add( Expression.eq("age", new Integer(2) ) )
) )
.list();
有很多预制的条件类型(Expression的子类)。有一个特别有用,可以让你直接嵌入SQL。
List cats = sess.createCriteria(Cat.class)
.add( Expression.sql("lower($alias.name) like lower(?)", "Fritz%", Hibernate.STRING) )
.list();
其中的{alias}是一个占位符,它将会被所查询实体的行别名所替代。(原文:The {alias} placeholder with be replaced by the row alias of the queried entity.)
12.3. 对结果排序
可以使用net.sf.hibernate.expression.Order对结果集排序.
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "F%")
.addOrder( Order.asc("name") )
.addOrder( Order.desc("age") )
.setMaxResults(50)
.list();
12.4. 关联(Associations)
你可以在关联之间使用createCriteria(),很容易地在存在关系的实体之间指定约束。
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "F%")
.createCriteria("kittens")
.add( Expression.like("name", "F%")
.list();
注意,第二个createCriteria()返回一个Criteria的新实例,指向kittens集合类的元素。
下面的替代形式在特定情况下有用。
List cats = sess.createCriteria(Cat.class)
.createAlias("kittens", "kt")
.createAlias("mate", "mt")
.add( Expression.eqProperty("kt.name", "mt.name") )
.list();
(createAlias())并不会创建一个Criteria的新实例。)
请注意,前面两个查询中Cat实例所持有的kittens集合类并没有通过criteria预先过滤!如果你希望只返回满足条件的kittens,你必须使用returnMaps()。
List cats = sess.createCriteria(Cat.class)
.createCriteria("kittens", "kt")
.add( Expression.eq("name", "F%") )
.returnMaps()
.list();
Iterator iter = cats.iterator();
while ( iter.hasNext() ) {
Map map = (Map) iter.next();
Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
Cat kitten = (Cat) map.get("kt");
}
12.5. 动态关联对象获取(Dynamic association fetching)
可以在运行时通过setFetchMode()来改变关联对象自动获取的策略。
List cats = sess.createCriteria(Cat.class)
.add( Expression.like("name", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.setFetchMode("kittens", FetchMode.EAGER)
.list();
这个查询会通过外连接(outer join)同时获得 mate和kittens。
12.6. 根据示例查询(Example queries)
net.sf.hibernate.expression.Example类允许你从指定的实例创造查询条件。
Cat cat = new Cat();
cat.setSex('F');
cat.setColor(Color.BLACK);
List results = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.list();
版本属性,表示符属性和关联都会被忽略。默认情况下,null值的属性也被排除在外。
You can adjust how the Example is applied. 你可以调整示例(Example)如何应用。
Example example = Example.create(cat)
.excludeZeroes() //exclude zero valued properties
.excludeProperty("color") //exclude the property named "color"
.ignoreCase() //perform case insensitive string comparisons
.enableLike(); //use like for string comparisons
List results = session.createCriteria(Cat.class)
.add(example)
.list();
你甚至可以用示例对关联对象建立criteria。
List results = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.createCriteria("mate")
.add( Example.create( cat.getMate() ) )
.list();
分享到:
相关推荐
1. **CriteriaQuery**: 这是查询的主对象,用于定义查询的类型(例如,选择、更新或删除)以及要查询的数据实体。 2. **Root**: 它代表查询的起点,通常是对数据库表的引用。在Criteria查询中,我们创建一个Root...
Criteria查询是Hibernate提供的API,与传统的HQL(Hibernate Query Language)查询相比,它更具有动态性和灵活性。Criteria查询允许你在运行时构建查询,这在处理动态或复杂的查询需求时尤其有用。下面我们将深入...
Criteria API基于面向对象的方式进行查询构建,可以动态地添加各种查询条件,包括等值比较、范围查询、模糊查询等,使得查询操作更加直观和易于管理。 ### 模糊查询的意义 模糊查询是数据库操作中常见的一种需求,...
### Hibernat 使用Criteria查询多对多关系(SET集合)条件 #### 背景介绍与概念理解 在Java开发中,特别是在企业级应用中,持久化层的处理至关重要。Hibernate作为一款流行的Java持久化框架,它提供了一种非常简便...
Detached Criteria可以在不与数据库交互的情况下构建查询条件,之后再绑定到某个会话执行。这在处理复杂查询时很有用。 4. **Query and Criteria的参数化** 两者都支持参数化查询,防止SQL注入。例如,根据用户名...
Hibernate 中 Criteria 的完整用法是 Hibernate 框架中的一种查询机制,允许开发者灵活地根据查询条件来组装查询语句。在使用 Spring 和 Hibernate 进行开发时,Criteria 的优势尤为明显。本文将对 Hibernate 中 ...
在本文中,我们将深入探讨如何在Spring Boot项目中利用Java Persistence API (JPA) 实现分页和动态多条件查询,并结合Thymeleaf模板引擎展示数据。Spring Boot以其简化配置和快速启动的优势,已经成为现代Java开发的...
在IT领域,尤其是在Java开发中,使用ORM框架如Hibernate时,条件类Criteria是进行动态查询的重要工具。Criteria API提供了一种面向对象的方式来构建SQL查询,它允许开发者在运行时动态地构建查询条件,无需手动编写...
**Criterion** 是Criteria查询条件的基础接口。它定义了如何设置查询条件,例如等价于(eq)、大于等于(ge)、范围(between)等。Criterion可以通过Restrictions工具类来创建,这个工具类提供了大量的静态方法用于...
Criteria 查询机制主要包括 QBE(Query By Example)、QBC(Query By Criteria)和 HQL(Hibernate Query Language)三种方式。 QBE(Query By Example) QBE 是一种基于示例的查询机制,它可以根据一个示例对象来...
与HQL(Hibernate Query Language)相比,`Criteria`API更接近于面向对象的风格,使得查询构建更为简单明了。 #### 使用示例 下面通过几个具体的例子来展示如何使用`Criteria`API。 ##### 示例1:创建基本查询 `...
Criteria API允许开发者以面向对象的方式构建查询条件,它能够自动地根据提供的查询条件生成SQL语句并执行,极大地简化了数据库查询的过程。 ```java Criteria criteria = session.createCriteria(User.class); ...
在Java的持久层框架Hibernate中,Criteria API是一个强大的查询工具,它可以用来替代传统的SQL或HQL(Hibernate Query Language)查询,以实现更加面向对象的数据库交互。Criteria API的设计旨在屏蔽不同数据库之间...
在基于Spring和Hibernate的项目开发中,Criteria API提供了灵活且强大的查询功能,使开发者能够轻松构建复杂的查询条件,从而提高数据检索的效率与精确度。本文将深入探讨Hibernate中Criteria API的全面应用,包括其...
与HQL(Hibernate Query Language)相比,Criteria API更易于理解和使用,尤其在处理复杂的查询条件时。它通过对象来表示查询条件,使得代码更具有可读性和可维护性。 ### 2. 创建Criteria查询 首先,我们需要从`...
Criteria和DetachedCriteria都可以利用Criterion和Projection来设置查询条件和结果处理。Criterion定义了查询的基本单元,例如单个条件,例如相等、大于、范围等。Junction接口(包括conjunction和disjunction)用于...
在Java的Hibernate框架中,Criteria API提供了一种用于动态构建查询的方法,它是Query By Criteria(QBC)查询方式的一部分。这种方式允许开发者避开编写HQL(Hibernate Query Language)语句,而是通过API调用来...