如何在几乎相同的标准中避免冗余?

时间:2011-05-19 12:23:36

标签: grails

想象一下,我有以下问题:

def result = Test.createCriteria().list(params) {
     // image here a lot of assocs, criterias, ...
}

在许多情况下,您需要上面查询的行数,例如列出许多控制器的动作。

def resultTotal = Test.createCriteria().list(params) {
     // Imagine here a lot of assocs, criterias, ...
     // Change to the criteria above is only the projection block
     projections { rowCount() }
}

我该如何避免这种情况?

4 个答案:

答案 0 :(得分:0)

你可以:

  1. 将条件创建提取为条件工厂/构建器方法;
  2. 使用named queries;
  3. 使用命名查询参数(和Groovy代码!)来“动态”更改查询,如:
  4. static namedQueries = {
        byLocation { Location location ->
            if (location) {
            ... // some more criteria logic
            }
        }
    }
    

答案 1 :(得分:0)

如果您没有对查询结果进行分页,则可以在调用第一个查询后执行以下操作:

def resultTotal = result?.size()

答案 2 :(得分:0)

对于在许多地方使用的同一组查询,我将它们创建为闭包并将其委托更改为相关条件。 例如:

def query = {
   projections{
       rowCount()
     }
   eq('type', myType)
  }

 def criteria = Customer.createCriteria()
        query.delegate = criteria
        myType = CustomerType.guest
        List records = criteria.list(params) {
            query()
        }

答案 3 :(得分:0)

我像这样使用totalCount:

def list() {
    def myInstanceList = MyInstance.createCriteria().list(params){
        eq('name', params.name)
    }
    [myInstanceList: myInstanceList, myInstanceListTotal: myInstanceList.totalCount]
}