我正在我的 Grails 应用程序中进行一些分页。由于我正在做一些特殊的排序,我不能使用方便的排序/分页方法。这是我在服务器端的分页代码:
def criteria = ClientContact.createCriteria().createAlias("client", "c")
criteria.setFirstResult(params.offset?.toInteger())
criteria.setMaxResults(params.max?.toInteger())
def sortField = params.sort
if(params.sort == "clientName") sortField = "c.name"
criteria.addOrder(params.order == "asc" ? Order.asc(sortField) : Order.desc(sortField))
/*
if(!StringUtils.isBlank(params.searchField))
{
criteria.add(
Restrictions.or (
Restrictions.ilike("c.name", "%" + params.searchField + "%"),
Restrictions.or(
Restrictions.ilike("firstName", "%" + params.searchField + "%"),
Restrictions.ilike("lastName", "%" + params.searchField + "%")
)
)
)
}
*/
def results = criteria.list()
您会注意到注释掉的代码部分。通常,它不会被注释,因此我可以进行特殊排序,但它被注释掉以帮助减少导致此问题的变量数量。
当我查看结果的第 4 页时,我看到了一定的人员名单。当我重新加载结果的第 4 页时,我看到了一个稍微不同的列表——移动了 8 个人。
有谁知道为什么我会收到不一致的结果?每次查看我的结果的第 4 页时,我希望得到相同的 100 人(如果你没有猜到,我正在显示人们的名字)。'offset'、'max' 和 'sort' 值在两个请求中是相同的。
任何帮助表示赞赏。谢谢,
安德鲁
更新....
这是应该工作的更直接的方法,除非我收到异常。如果我删除“createAlias”行,我不会收到异常。不幸的是,我需要别名才能加入关联的表。
if(params.sort == 'client') params.sort = 'c.name'
def criteria = ClientContact.createCriteria()
criteria.createAlias('client', 'c')
def pagedResults = criteria.list(offset: params.offset, max: params.max, sort: params.sort, order: params.order ?: 'asc' ) {
if(!StringUtils.isBlank(params.searchField)) {
or {
ilike "c.name", "%$params.searchField%"
ilike "firstName", "%$params.searchField%"
ilike "lastName", "%$params.searchField%"
}
}
}
例外:
原因:java.lang.IllegalArgumentException: call to [list] not supported here
在 grails.orm.HibernateCriteriaBuilder.invokeMethod(HibernateCriteriaBuilder.java:847)
在 ClientContactController$_closure21_closure39_closure44.doCall(ClientContactController:494)