Grails 中的 withCriteria 和 CreateCriteria 有啥区别?

Posted

技术标签:

【中文标题】Grails 中的 withCriteria 和 CreateCriteria 有啥区别?【英文标题】:What is the difference between withCriteria and CreateCriteria in Grails?Grails 中的 withCriteria 和 CreateCriteria 有什么区别? 【发布时间】:2013-05-19 17:07:47 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

SomeDomain.createCriteria().list(max:10, offset:50) 
  // ...

【讨论】:

您能告诉我如何使用 BETWEEN 子句编写从/到日期的查询吗? @VVB 如果您无法从grails.github.io/grails-doc/latest/ref/Domain%20Classes/… 的信息中得到它,那么您最好将其作为一个 SO 问题单独提出,因为它与这个问题的主题。 好的@IanRoberts 我要发布新问题请检查它 @IanRoberts 我刚刚在***.com/questions/28604309/… 上发布了新问题,请您回答一下,以便我投票并接受您的回答。【参考方案2】:

值得添加我刚刚在createCriteria() 的 grails 文档中看到的内容。

因为该查询包含分页参数(最大值和偏移量),这将返回一个 PagedResultList,它有一个 getTotalCount() 方法来返回分页匹配记录的总数。两个查询仍在运行,但它们会为您运行,并且结果和总数合并在 PagedResultList 中。

Source

这意味着您可以使用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() 时,此功能可用。

【讨论】:

你能告诉我如何使用上面的 BETWEEN 子句编写查询从/到日期吗? @VVB 您的问题更适合作为新的 *** 问题,而不是将其作为评论包含在此处。【参考方案3】:

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)

【讨论】:

感谢您提供的示例。似乎 createCritera 在找到域对象和 withCriteria 之后应用条件参数 - 首先应用查询参数,然后是域对象查找。不是吗? 是的!如果您使用 createCriteria,您可以执行列表等多项操作。但是,如果您使用 'withCriteria',则默认操作是列表。 (您不能进行任何其他操作)。【参考方案4】:

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

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

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

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

【讨论】:

你能举个例子吗?【参考方案5】:

withCriteria ->

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

如果指定了投影:

returns a single value if it only contains one field
a List in case there are multiple fields in the projection

【讨论】:

以上是关于Grails 中的 withCriteria 和 CreateCriteria 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

没有标准的完整计数

使用 withCriteria 时限制数据范围

IntelliJ 中的 Grails 3 调试

Grails 插件中的自定义 CSS 和 JS

grails中的访问控制、角色和权限

如何保护 Grails 中的所有 REST 请求和响应