如果已提供列表,如何使用grails分页?

时间:2016-03-22 08:01:55

标签: grails pagination

我有一个看起来像这样的方法

def searchInAllField(String searchString) {

    Long companyId = sessionService.userProfile.companyId;
    return Vendor.createCriteria().list(){

        eq("companyId", companyId);
        if (searchString) {
            or {
                ilike("name", "%${searchString}%")
                ilike("businessName", "%${searchString}%")
                ilike("address", "%${searchString}%")
                ilike("description", "%${searchString}%")
                ilike("contactPerson", "%${searchString}%")
                ilike("mobileNumber", "%${searchString}%")
                ilike("officeNumber", "%${searchString}%")
                ilike("email", "%${searchString}%")
            }
        }
        order("businessName", "asc");

    } ?: [];
}

此方法接受searchString参数并检查它是否与所有字段中的值匹配。

此方法的结果是需要显示并放入分页的列表。如果我已经有列表,我怎么能把grails分页?

1 个答案:

答案 0 :(得分:1)

要使用分页,您的searchInAllField()方法需要包含maxoffset参数。

def searchInAllField(String searchString, int max, int offset) {

    Long companyId = sessionService.userProfile.companyId;
    return Vendor.createCriteria().list(max: max, offset: offset) {

        eq("companyId", companyId);
        if (searchString) {
            or {
                ilike("name", "%${searchString}%")
                ilike("businessName", "%${searchString}%")
                ilike("address", "%${searchString}%")
                ilike("description", "%${searchString}%")
                ilike("contactPerson", "%${searchString}%")
                ilike("mobileNumber", "%${searchString}%")
                ilike("officeNumber", "%${searchString}%")
                ilike("email", "%${searchString}%")
            }
        }
        order("businessName", "asc")

    }
}

调用searchInAllField()的控制器方法需要传递maxoffset,并在模型中提供总计数:

def someControllerMethod() {
    def vendors = whatever.searchInAllField(searchString, params.max, params.offset)

    render(model: [vendors: vendors, totalVendors: vendors.totalCount])
}

总计数(在本例中为vendors.totalCount)非常重要。 g:paginate taglib需要它才能正常运行。

注意:g:paginate文档可能误导您。它演示了使用DomainClass.count()作为总计数。您想要的是查询结果计数而不是数据库表中的记录总数。 totalCount属性提供了您所需的属性,但只有在使用offsetmax执行查询时才能获取该属性。

最后,您可以使用GSP代码中的g:paginate taglib来呈现分页链接:

<g:paginate controller="someController" action="someControllerMethod" total="${totalVendors}" />