(快速参考)

createCriteria

目的

创建并返回 Grails 的 HibernateCriteriaBuilder 的一个实例,可用于构建条件查询。

单元测试对 GORM 使用了内存实施,不带 Hibernate,因此 createCriteria() 返回的是 CriteriaBuilder 实例,而不是 HibernateCriteriaBuilder。

示例

从 HibernateCriteriaBuilder(如本文档中以下示例中所示)可以通过静态方式导入用于构建条件的条件方法(如,and、or、between 等等),或者写成“c.like(…​)”、“c.between(…​)”等等。

def c = Account.createCriteria()
def results = c.list {
    like("holderFirstName", "Fred%")
    and {
        between("balance", 500, 1000)
        eq("branch", "London")
    }
    maxResults(10)
    order("holderLastName", "desc")
}

要使用分页,您必须执行另一查询来检索匹配结果的总数。更好的办法是按照下面所示将分页值作为参数传递给条件方法

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() 方法与分页选项 maxResultfirstResult 配合得不好。如果您需要使用分页来获得不同的结果,那么目前建议使用 HQL。您可以从 这篇博客文章 中了解到更多信息。

如果您使用生成器调用方法名称

c { ... }

则将自动调用 list() 方法。换句话说,这等效于

c.list { ... }

以下是对每个准则方法的节点参考

节点 说明 示例

between

其中属性值在两个不同值之间

between("余额", 500, 1000)

eq

其中一个属性等于特定值。

eq("分行", "伦敦")

eq (不区分大小写)

eq 的一个版本,提供可选的第三个 Map 参数以指定查询不区分大小写。

eq("分行", "伦敦", [ignoreCase: true])

eqProperty

其中一个属性必须等于另一个属性

eqProperty("lastTx", "firstTx")

gt

其中一个属性大于特定值

gt("余额",1000)

gtProperty

其中一个属性必须大于另一个属性

gtProperty("余额", "透支")

ge

其中一个属性大于或等于特定值

ge("余额", 1000)

geProperty

其中一个属性必须大于或等于另一个属性

geProperty("余额", "透支")

idEq

其中一个对象的 ID 等于指定的值

idEq(1)

ilike

不区分大小写的“类似于”表达式

ilike("持有人名", "Steph%")

in

其中一个属性包含在指定的值列表中。还可以与 not 方法连接,表示一个属性不包含在指定的值列表中。注意:“in”是 Groovy 保留字,因此必须用引号对其进行转义。

'in'("年龄",[18..65])not {'in'("年龄",[18..65])}

inList

in 相同,但不需要引号。

inList("年龄",[18..65])not {inList("年龄",[18..65])}

isEmpty

其中一个集合属性为空

isEmpty("交易")

isNotEmpty

其中一个集合属性不为空

isNotEmpty("交易")

isNull

其中一个属性为 null

isNull("持有人性别")

isNotNull

其中一个属性不为 null

isNotNull("持有人性别")

lt

其中一个属性小于特定值

lt("余额", 1000)

ltProperty

其中一个属性必须小于另一个属性

ltProperty("余额", "透支")

le

一个属性小于或等于某个特定的值

le("balance", 1000)

leProperty

指定一个属性必须小于或等于另一个属性

leProperty("balance", "overdraft")

like

相当于 SQL like 表达式

like("holderFirstName", "Steph%")

ne

指定一个属性不等于某个特定的值

ne("branch", "London")

neProperty

指定一个属性不等于另一个属性

neProperty("lastTx", "firstTx")

order

按某个特定的属性对结果排序

order("holderLastName", "desc")

rlike

类似于 like,但是使用正则表达式。仅支持 Oracle 和 MySQL

rlike("holderFirstName", /Steph.+/)

sizeEq

集合属性的大小等于某个特定值

sizeEq("transactions", 10)

sizeGt

集合属性的大小大于某个特定值

sizeGt("transactions", 10)

sizeGe

集合属性的大小大于或等于某个特定值

sizeGe("transactions", 10)

sizeLt

集合属性的大小小于某个特定值

sizeLt("transactions", 10)

sizeLe

集合属性的大小小于或等于某个特定值

sizeLe("transactions", 10)

sizeNe

集合属性的大小不等于某个特定值

sizeNe("transactions", 10)

sqlRestriction

使用任意的 SQL 来修改结果集

sqlRestriction "char_length(first_name) = 4"

使用动态查找器功能时,你可以访问诸如 max, sort 等选择。条件查询也可以使用这些选择,但它们有不同的名称

名称 说明 示例

order(String, String)

同时指定排序列(第一个参数)和排序顺序('asc' 或 'desc')

order "age", "desc"

firstResult(int)

指定结果的偏移量。值为 0 将返回所有记录(最多达到指定最大值)

firstResult 20

maxResults(int)

指定要返回的最大记录数

maxResults 10

cache(boolean)

指定是否应缓存此查询(如果已启用查询缓存)

cache 'true'

条件还支持投影的概念。投影用于改变结果的性质。例如,下列查询使用投影来计算每个 Account 存在的 branch 名称的去重数

def c = Account.createCriteria()
def branchCount = c.get {
    projections {
        countDistinct "branch"
    }
}

下表概括了不同的投影和它们的作用

名称 说明 示例

property

在返回结果中返回指定的属性

property("firstName")

distinct

使用单个或多个去重的属性名称返回结果

distinct("fn") 或 distinct(['fn', 'ln'])

avg

返回给定属性的平均值

avg("age")

count

返回给定属性名称的计数

count("branch")

countDistinct

返回针对不同行的给定属性名称的计数

countDistinct("branch")

groupProperty

按给定属性对结果进行分组

groupProperty("lastName")

max

返回给定属性的最大值

max("age")

min

返回给定属性的最小值

min("age")

sum

返回给定属性的总和

sum("balance")

rowCount

返回返回的行数的计数

rowCount()