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