我有一个看起来像这样的方法
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分页?
答案 0 :(得分:1)
要使用分页,您的searchInAllField()
方法需要包含max
和offset
参数。
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()
的控制器方法需要传递max
和offset
,并在模型中提供总计数:
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
属性提供了您所需的属性,但只有在使用offset
和max
执行查询时才能获取该属性。
最后,您可以使用GSP代码中的g:paginate
taglib来呈现分页链接:
<g:paginate controller="someController" action="someControllerMethod" total="${totalVendors}" />