Grails中withCriteria和CreateCriteria有什么区别?

dan*_*lad 17 grails

它们的区别是什么以及我们需要使用它们的原因和位置,我认为它们对我来说似乎没什么区别?

Ian*_*rts 9

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

SomeDomain.createCriteria().list(max:10, offset:50) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)


mnd*_*mnd 7

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

因为该查询包括分页参数(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}"
Run Code Online (Sandbox Code Playgroud)

使用时无法使用此功能withCriteria().


bin*_*iam 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()
Run Code Online (Sandbox Code Playgroud)

示例withCriteria():

List<Supermarket> results = Supermarket.withCriteria {
    like("sp_street", params.street)
    productSupermarket {
         product {
            idEq(params.product)
        }
        // or just eq('product', someProduct)
    }
    maxResults(10)
}
Run Code Online (Sandbox Code Playgroud)

  • 我很欣赏你给出的例子.似乎createCritera在找到域对象之后应用条件参数,并且首先使用Criteria -apply查询参数并且接下来主要查找对象.不是吗? (2认同)