Hibernate Grails分页结果不一致
我正在Grails应用程序中进行一些分页。因为我在做一些特殊的排序,所以不能使用方便的排序/分页方法。以下是我在服务器端的分页代码:Hibernate Grails分页结果不一致,hibernate,grails,gorm,paging,Hibernate,Grails,Gorm,Paging,我正在Grails应用程序中进行一些分页。因为我在做一些特殊的排序,所以不能使用方便的排序/分页方法。以下是我在服务器端的分页代码: def criteria = ClientContact.createCriteria().createAlias("client", "c") criteria.setFirstResult(params.offset?.toInteger()) criteria.setMaxResults(params.max?.toInteger()) def sortFi
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人(如果你没有猜到,我会显示他们的名字)。两个请求的“偏移量”、“最大值”和“排序”值相同
感谢您的帮助。谢谢
安德鲁
更新
这里有一个更简单的方法应该可以工作,除非我收到一个异常。如果删除“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:
此处不支持对[列表]的调用
在
grails.orm.HibernateCriteriaBuilder.invokeMethod(HibernateCriteriaBuilder.java:847)
在
ClientContactController$\u closure21\u closure39\u closure44.doCall(ClientContactController:494)
我不知道为什么不同请求之间的排序不一致,但我想向您展示代码的“默认”grails方法:
if(params.sort == 'clientName') params.sort = 'c.name'
def criteria = ClientContact.createCriteria()
criteria.createAlias('client', 'c')
def results = criteria.list( 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%"
}
}
}
然后,results变量是PagedResultList的一个实例,它基本上是一个普通的列表,但有一个“totalCount”属性来简化分页。这对我不起作用,因为我需要关联表的别名。由于ClientContact有一个与之关联的客户端对象,如果我想按其Client.Name对ClientContact进行排序,我需要为Client表创建一个别名。这就是我最终使用Hibernate标准构建器的原因。我希望您的代码能够正常工作,但无法编译。我已经更新了我原来的帖子。您可以看到我是如何实现您的示例的。我还包括了我收到的例外情况。但我同意你的看法,这应该行得通。