def c = Account.createCriteria()
def results = c.list {
like("holderFirstName", "Fred%")
and {
between("balance", 500, 1000)
eq("branch", "London")
}
maxResults(10)
order("holderLastName", "desc")
}
createCriteria
目的
创建并返回 Grails 的 HibernateCriteriaBuilder 的一个实例,可用于构建条件查询。
单元测试对 GORM 使用了内存实施,不带 Hibernate,因此 createCriteria() 返回的是 CriteriaBuilder 实例,而不是 HibernateCriteriaBuilder。 |
示例
从 HibernateCriteriaBuilder(如本文档中以下示例中所示)可以通过静态方式导入用于构建条件的条件方法(如,and、or、between 等等),或者写成“c.like(…)”、“c.between(…)”等等。
要使用分页,您必须执行另一查询来检索匹配结果的总数。更好的办法是按照下面所示将分页值作为参数传递给条件方法
def c = Account.createCriteria()
def results = c.list (max: 10, offset: 10) {
like("holderFirstName", "Fred%")
and {
between("balance", 500, 1000)
eq("branch", "London")
}
order("holderLastName", "desc")
}
由于此查询包括分页参数(max 和 offset),这将返回一个 PagedResultList,其中有一个 getTotalCount()
方法,用于返回分页的匹配记录的总数。仍然会运行两个查询,但这些查询是为您运行的,结果和总数在 PagedResultList
中组合。
println "Rendering ${results.size()} Accounts of ${results.totalCount}"
说明
条件查询是一种类型安全的、高级的查询方式,它使用 Groovy 构造函数构建潜在的复杂查询。它比使用 StringBuilder 动态构建 HQL 查询要好得多。有关使用说明,请参阅用户指南中关于 Criteria 的部分。
方法引用
方法 | 说明 |
---|---|
list |
默认方法;返回所有匹配的行。 |
get |
返回一个唯一的结果,即只有一行。条件必须以这种方式形成,即它只查询一行。此方法不应与只限制为第一行的限制混淆。 |
scroll |
返回一个可滚动的结果集 |
listDistinct |
如果使用子查询或关联,那么最终在结果集中可能会出现多行相同。在 Hibernate 中可以执行“CriteriaSpecification.DISTINCT_ROOT_ENTITY”。在 Grails 中可以使用此方法来执行此操作。 |
listDistinct() 方法与分页选项 maxResult 和 firstResult 配合得不好。如果您需要使用分页来获得不同的结果,那么目前建议使用 HQL。您可以从 这篇博客文章 中了解到更多信息。 |
如果您使用生成器调用方法名称
c { ... }
则将自动调用 list()
方法。换句话说,这等效于
c.list { ... }
以下是对每个准则方法的节点参考
节点 | 说明 | 示例 |
---|---|---|
between |
其中属性值在两个不同值之间 |
|
eq |
其中一个属性等于特定值。 |
|
eq (不区分大小写) |
eq 的一个版本,提供可选的第三个 Map 参数以指定查询不区分大小写。 |
|
eqProperty |
其中一个属性必须等于另一个属性 |
|
gt |
其中一个属性大于特定值 |
|
gtProperty |
其中一个属性必须大于另一个属性 |
|
ge |
其中一个属性大于或等于特定值 |
|
geProperty |
其中一个属性必须大于或等于另一个属性 |
|
idEq |
其中一个对象的 ID 等于指定的值 |
|
ilike |
不区分大小写的“类似于”表达式 |
|
in |
其中一个属性包含在指定的值列表中。还可以与 |
|
inList |
与 |
|
isEmpty |
其中一个集合属性为空 |
|
isNotEmpty |
其中一个集合属性不为空 |
|
isNull |
其中一个属性为 |
|
isNotNull |
其中一个属性不为 |
|
lt |
其中一个属性小于特定值 |
|
ltProperty |
其中一个属性必须小于另一个属性 |
|
le |
一个属性小于或等于某个特定的值 |
|
leProperty |
指定一个属性必须小于或等于另一个属性 |
|
like |
相当于 SQL like 表达式 |
|
ne |
指定一个属性不等于某个特定的值 |
|
neProperty |
指定一个属性不等于另一个属性 |
|
order |
按某个特定的属性对结果排序 |
|
rlike |
类似于 like,但是使用正则表达式。仅支持 Oracle 和 MySQL |
|
sizeEq |
集合属性的大小等于某个特定值 |
|
sizeGt |
集合属性的大小大于某个特定值 |
|
sizeGe |
集合属性的大小大于或等于某个特定值 |
|
sizeLt |
集合属性的大小小于某个特定值 |
|
sizeLe |
集合属性的大小小于或等于某个特定值 |
|
sizeNe |
集合属性的大小不等于某个特定值 |
|
sqlRestriction |
使用任意的 SQL 来修改结果集 |
|
使用动态查找器功能时,你可以访问诸如 max
, sort
等选择。条件查询也可以使用这些选择,但它们有不同的名称
名称 | 说明 | 示例 |
---|---|---|
order(String, String) |
同时指定排序列(第一个参数)和排序顺序('asc' 或 'desc') |
|
firstResult(int) |
指定结果的偏移量。值为 0 将返回所有记录(最多达到指定最大值) |
|
maxResults(int) |
指定要返回的最大记录数 |
|
cache(boolean) |
指定是否应缓存此查询(如果已启用查询缓存) |
|
条件还支持投影的概念。投影用于改变结果的性质。例如,下列查询使用投影来计算每个 Account
存在的 branch
名称的去重数
def c = Account.createCriteria()
def branchCount = c.get {
projections {
countDistinct "branch"
}
}
下表概括了不同的投影和它们的作用
名称 | 说明 | 示例 |
---|---|---|
property |
在返回结果中返回指定的属性 |
|
distinct |
使用单个或多个去重的属性名称返回结果 |
|
avg |
返回给定属性的平均值 |
|
count |
返回给定属性名称的计数 |
|
countDistinct |
返回针对不同行的给定属性名称的计数 |
|
groupProperty |
按给定属性对结果进行分组 |
|
max |
返回给定属性的最大值 |
|
min |
返回给定属性的最小值 |
|
sum |
返回给定属性的总和 |
|
rowCount |
返回返回的行数的计数 |
|