我有一个创建标准,使用多个params和分页。 我有这个问题,如果有可能重新使用其中的代码和其他创建标准完全不同,可能不得不复制代码。 我认为,如果我有案例createcriteria并希望对案例2做同样的“过滤器”而不必复制代码,统一两个createCriteria都不是一个选项 每个例子,我面临的问题是需要使用分页,而其他不需要,并且两者都需要访问不同的字段,因此唯一的选择是创建两个相同的创建条件,如果我我不会遗漏什么。 这是一个例子,案例对于案例2至少有90%不公平,重用代码的好方法是什么?
def cases = PpCase.createCriteria().list{
and{
if(limit){
maxResults(limit)
}
firstResult(offset)
order("mostRecentPaymentDate", "desc")
order("totalAmount", "desc")
if(params.admin_id){
eq("adminId",params.admin_id)
}
if(params.status){
eq("status",params.status.toUpperCase() as PpCase.Status)
}
if(params.date_from){
ge('dateCreated', Date.parse("yyyy-MM-dd",params.date_from))
}
if(params.date_to){
le('dateCreated', Date.parse("yyyy-MM-dd",params.date_to))
}
if(params.date_closed_from){
ge('closedDate', Date.parse("yyyy-MM-dd",params.date_closed_from))
}
if(params.date_closed_to){
le('closedDate', Date.parse("yyyy-MM-dd",params.date_closed_to))
}
}
}
def cases2 = PpCase.createCriteria().list{
and{
firstResult(offset)
order("mostRecentPaymentDate", "desc")
order("totalAmount", "desc")
if(params.admin_id){
eq("adminId",params.admin_id)
}
if(params.status){
eq("status",params.status.toUpperCase() as PpCase.Status)
}
if(params.date_from){
ge('dateCreated', Date.parse("yyyy-MM-dd",params.date_from))
}
if(params.date_to){
le('dateCreated', Date.parse("yyyy-MM-dd",params.date_to))
}
if(params.date_closed_from){
ge('closedDate', Date.parse("yyyy-MM-dd",params.date_closed_from))
}
if(params.date_closed_to){
le('closedDate', Date.parse("yyyy-MM-dd",params.date_closed_to))
}
}
}
更真实的例子: 如果我需要一些字段,但有一个限制,在case2中我需要不同的字段,并且有一个限制,我复制了90%的代码。
def cases = PpCase.createCriteria().list{
projections {
sum("field1")
countDistinct("id")
}
and{
if(limit){
maxResults(limit)
}
//HERE SHOULD BE THE CODE THAT I NEED TO REUTILIZE
}
def cases2 = PpCase.createCriteria().list{
projections {
sum("field2")
countDistinct("id")
}
and{
//HERE SHOULD BE THE CODE THAT I NEED TO REUTILIZE
}
答案 0 :(得分:3)
我使用"where" queries,其中DetachedCriteria
使用list
或DetachedCriteria
directly。查询不会运行,直到您致电get
/ count
/ exists
/ deleteAll
/ updateAll
/ {{1}},因此他们&# 39;非常适合在部分中撰写查询。命名查询可以类似地组成,但它们需要是完整的,可运行的查询,但只要在运行它们之前通过组合添加缺少的部分,查询就可以了。它们也更灵活,因为您可以使用它们来删除和更新。
答案 1 :(得分:2)
您可以使用命名查询来执行此操作: 看看文档。namedQueries
答案 2 :(得分:2)
当你说"统一createCriteria都不是一个选项"时,我不确定你是什么意思,特别是考虑到上面的代码,你执行完全相同的查询两次,最后得到两个包含相同行的列表。
重用标准的一种方法是将条件定义为单独的闭包,并将其传递给createCriteria。
Closure fetchPayments = {
and{
if(limit){
maxResults(limit)
}
firstResult(offset)
order("mostRecentPaymentDate", "desc")
order("totalAmount", "desc")
if(params.admin_id){
eq("adminId",params.admin_id)
}
if(params.status){
eq("status",params.status.toUpperCase() as PpCase.Status)
}
if(params.date_from){
ge('dateCreated', Date.parse("yyyy-MM-dd",params.date_from))
}
if(params.date_to){
le('dateCreated', Date.parse("yyyy-MM-dd",params.date_to))
}
if(params.date_closed_from){
ge('closedDate', Date.parse("yyyy-MM-dd",params.date_closed_from))
}
if(params.date_closed_to){
le('closedDate', Date.parse("yyyy-MM-dd",params.date_closed_to))
}
}
}
def cases = PpCase.createCriteria().list(fetchPayments)
def cases2 = PpCase.createCriteria().list(fetchPayments)