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

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

【问题讨论】:

    标签: grails


    【解决方案1】:

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

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

    【讨论】:

    【解决方案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 您的问题更适合作为新的 stackoverflow 问题,而不是将其作为评论包含在此处。
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      • 2017-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-26
      相关资源
      最近更新 更多