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