它们的区别是什么以及我们需要使用它们的原因和地点,我认为它们对我来说似乎没什么区别?
答案 0 :(得分:9)
withCriteria { ... }
基本上是createCriteria().list { ... }
的简写。如果您需要使用任何其他标准方法(get,count,...)或将分页参数传递给list
,那么您必须使用长手形式。
SomeDomain.createCriteria().list(max:10, offset:50) {
// ...
}
答案 1 :(得分:7)
值得添加我在createCriteria()
的grails文档中遇到的内容。
因为该查询包含分页参数(max和offset),所以这将返回一个PagedResultList,它具有getTotalCount()方法以返回分页的匹配记录总数。仍然运行两个查询,但它们是为您运行的,结果和总计数在PagedResultList中合并。
这意味着您可以使用getTotalCount()
而无需发起呼叫(它是为您制作的)。这非常有帮助。示例文档显示:
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")
}
println "Rendering ${results.size()} Accounts of ${results.totalCount}"
使用withCriteria()
时,此功能不。
答案 2 :(得分:5)
createCriteria()
的示例:
def criteria = OfferCredit.createCriteria {
offer {
eq('status', LeverageUtils.ACTIVE_STATUS)
ge('expirationDate', new Date())
}
user {
eq('userId', userId)
}
eq('status', LeverageUtils.ACTIVE_STATUS)
order('creationDate', 'asc')
}
criteria.list()
withCriteria()
的示例:
List<Supermarket> results = Supermarket.withCriteria {
like("sp_street", params.street)
productSupermarket {
product {
idEq(params.product)
}
// or just eq('product', someProduct)
}
maxResults(10)
}
答案 3 :(得分:4)
withCriteria执行并返回列表。它提供了一个闭包,您可以使用该闭包在执行之前自定义条件。
createCriteria只创建一个可以修改的条件对象,然后显式调用list方法来执行。
如果标准很简单或者在一个地方定义,最好使用withCriteria。
如果你需要传递标准(在一个函数中创建并将其传递给其他人),createCriteria会更好。我认为对标准的支持是有限的。
答案 4 :(得分:2)
withCriteria - &gt;
目的 - &gt;允许内联执行Criteria查询。 如果未找到匹配的记录,则返回空列表。
如果指定了投影:
returns a single value if it only contains one field
a List in case there are multiple fields in the projection