grails 2.4.4,如何对非常大的记录集进行分页,所以不知道总数
grails 2.4.4, how to do pagination with very large record set, so dont know the total
我能找到的所有例子都是这样的:
<g:paginate controller="Book" action="list" total="${bookInstanceTotal}" />
根据documentation,总属性为"required"。
这适用于非常简单的小记录集示例(例如几百个)
如果因为用户输入了广泛的搜索条件而返回了 100k 行,那么我当然不想全部阅读以找到允许分页的总数,也不想传输所有 100k 行从数据库到 Grails 服务器,并且不想在每次点击下一页时都重复此操作。我想使用 mysql limit/offset 或类似的方法来只带回少量所需的行。
这可能吗,还是我真的必须算出总数(通过读取所有记录,或者单独计数,然后读取记录?
您不会从数据库中读取所有记录并在 grails 中加载以获得总数。您只需加载 10 条或您在每个页面中显示的任意数量的记录,然后执行计数查询以获取总计数。
它是这样工作的。
比方说,您在每个页面上显示 10 条记录,而数据库中有 10 万条记录。
假设 UI 传递了最大和偏移参数。
params.max = params.max ? (params.int(max) < 100 : params.max : 100) : 10
params.offset = params.offset ?: 0
def list = Domain.list(params)
指定最大选项时,Domain.list() 方法 returns PagedResultList 具有触发计数查询的 getTotalCount() 方法和 returns totalCount。
然后你像这样渲染视图
render(view:"list", model:[list:list, totalCount:list.totalCount)
所以这里你没有从数据库中加载所有记录,你只加载了 10 条记录并执行计数查询以获得 totalCount
我总是喜欢使用分页标准。
使用条件的示例:
def c = Account.createCriteria()
def results = c.list (max: 10, offset: 10) {
like("holderFirstName", "Fred%")
and {
between("balance", 500, 1000)
eq("branch", "London")
}
order("holderLastName", "desc")
}
这个例子来自grails documentation and you can read more about criteria in this documentation。
使用此标准,您将获得最多 10 个结果。但重要的是您可以根据相同的标准使用
获得总数
results.totalCount
我能找到的所有例子都是这样的:
<g:paginate controller="Book" action="list" total="${bookInstanceTotal}" />
根据documentation,总属性为"required"。
这适用于非常简单的小记录集示例(例如几百个)
如果因为用户输入了广泛的搜索条件而返回了 100k 行,那么我当然不想全部阅读以找到允许分页的总数,也不想传输所有 100k 行从数据库到 Grails 服务器,并且不想在每次点击下一页时都重复此操作。我想使用 mysql limit/offset 或类似的方法来只带回少量所需的行。
这可能吗,还是我真的必须算出总数(通过读取所有记录,或者单独计数,然后读取记录?
您不会从数据库中读取所有记录并在 grails 中加载以获得总数。您只需加载 10 条或您在每个页面中显示的任意数量的记录,然后执行计数查询以获取总计数。
它是这样工作的。
比方说,您在每个页面上显示 10 条记录,而数据库中有 10 万条记录。
假设 UI 传递了最大和偏移参数。
params.max = params.max ? (params.int(max) < 100 : params.max : 100) : 10
params.offset = params.offset ?: 0
def list = Domain.list(params)
指定最大选项时,Domain.list() 方法 returns PagedResultList 具有触发计数查询的 getTotalCount() 方法和 returns totalCount。
然后你像这样渲染视图
render(view:"list", model:[list:list, totalCount:list.totalCount)
所以这里你没有从数据库中加载所有记录,你只加载了 10 条记录并执行计数查询以获得 totalCount
我总是喜欢使用分页标准。
使用条件的示例:
def c = Account.createCriteria()
def results = c.list (max: 10, offset: 10) {
like("holderFirstName", "Fred%")
and {
between("balance", 500, 1000)
eq("branch", "London")
}
order("holderLastName", "desc")
}
这个例子来自grails documentation and you can read more about criteria in this documentation。
使用此标准,您将获得最多 10 个结果。但重要的是您可以根据相同的标准使用
获得总数results.totalCount