多个创建标准重用代码grails

时间:2015-01-15 12:53:35

标签: grails gorm

我有一个创建标准,使用多个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
 }

3 个答案:

答案 0 :(得分:3)

我使用"where" queries,其中DetachedCriteria使用listDetachedCriteria 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)