21

它们有什么区别,为什么以及我们需要在哪里使用它们,我认为它们对我来说似乎根本没有区别?

4

5 回答 5

11

withCriteria { ... }本质上是createCriteria().list { ... }. 如果您需要使用任何其他标准方法(get、count、...)或将分页参数传递给,list那么您必须使用长手形式。

SomeDomain.createCriteria().list(max:10, offset:50) {
  // ...
}
于 2013-05-24T08:02:34.767 回答
9

值得添加我刚刚在 grails 文档中遇到的createCriteria().

因为该查询包含分页参数(最大值和偏移量),所以这将返回一个 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()

于 2014-11-05T22:11:42.817 回答
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)
}
于 2013-06-18T08:21:45.590 回答
4

withCriteria 执行并返回列表。它提供了一个闭包,您可以使用它在执行之前自定义条件。

createCriteria 只是创建一个条件对象,您可以对其进行修改,然后显式调用 list 方法来执行。

如果条件很简单或者如果它被定义在一个地方,最好使用 withCriteria。

如果您需要传递标准(在一个函数中创建它并将其传递给其他函数)createCriteria 会更好。我认为 withCriteria 支持是有限的。

于 2013-05-24T07:02:42.877 回答
2

带有标准->

目的 -> 允许内联执行条件查询。如果没有找到匹配的记录,则返回一个空列表。

如果指定了投影:

returns a single value if it only contains one field
a List in case there are multiple fields in the projection
于 2015-01-23T07:11:33.603 回答