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

In Grails, how to get the total result count when we are passing max and offset values to the list method?

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

当指定 max 时,list() 方法 returns PagedResultList 有一个 totalCount 属性

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

你没有理解正确:)

检索所有记录以对它们进行计数并过滤掉不应该在客户端 returned 的记录是很疯狂的。几行并没有那么糟糕,但考虑一下像这样的方法对具有数百万或数十亿行的表的性能影响。

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

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

list 方法的实现是 here and you can see in the PagedResultList 计数查询的来源 运行 仅当您调用 getTotalCount.

Grails 条件查询和分页参数

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
}