在Grails中,当我们将max和offset值传递给list方法时,如何获得总结果数?

时间:2015-03-26 02:13:21

标签: grails pagination

如果我理解正确,我们可以通过将max和offset值传递给list方法来检索所需的分页特定结果数。但是,在许多情况下,我们还希望显示SQL查询返回的结果总数。根据我的理解,使用传递给list方法的偏移量和最大值,SQL查询仍会在内部返回所有结果,但结果将根据最大值和偏移量值进行修剪。有没有办法在修剪之前获得返回的结果总数?

3 个答案:

答案 0 :(得分:4)

你不明白:)

检索所有记录以计算它们并过滤掉那些不应该在客户端返回的记录将是疯狂的。对于几行来说,它不会那么糟糕,但考虑到具有数百万或数十亿行的表的方法的性能影响。

相反,您必须执行两个查询。一个用于检索所需的行,在数据库中执行过滤 ,另一个具有相同的where子句限制但没有max和offset值,并使用select count ...

正如@sudhir在他的回答中指出的那样,Grails将返回一个自定义List实现(PagedResultList),其中包含当前页面的结果,并且有getTotalCount方法返回计数查询的结果。

list方法的实施是here,您可以在PagedResultList来源中看到只有在您拨打getTotalCount时才会延迟执行计数查询。

答案 1 :(得分:3)

当指定max时,list()方法返回具有totalCount属性的PagedResultList

def list = DomainClass.list(params) { }
log.debug "Total records: $list.totalCount"    
render view:'list', model: [list:list, totalRecords:list.totalCount]

答案 2 :(得分:1)

Grails Criteria查询和分页参数

params.max = params?.max as Integer ?: 10
params.offset = params?.offset as Integer ?: 0
params.sort = params?.sort ?: "email"
params.order = params?.order ?: "asc"
params.filter = params?.filter ?: ""
params.packet = params?.packet ?: ""

def members = Member.createCriteria().list(params)
  {
    or
    {
      if(params.filter != ""){
        ilike("firstName", "%" + params.filter + "%")
        ilike("lastName", "%" + params.filter + "%")
        ilike("email", "%" + params.filter + "%")
        try {
          params.filter as Long
          eq("citizenId" , params.filter.toLong())
        }catch (e) {

        }
        ilike("mobile", "%" + params.filter + "%")
      }
    }
  }

def dataMembers = [:]
dataMembers.data = members
dataMembers.totalRecord = members.totalCount
render dataMembers as JSON

<强>输出

{
"data": [
    {
      "id":1,
      "firstName":name
    },
    {
      "id":2,
      "firstName":name
    }
  ],
"totalRecord":5
}