我正在Grails應用程序中進行一些分頁。由於我正在做一些特殊的排序,我不能使用便捷的排序/分頁方法。這是我在服務器端的分頁代碼: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個人(如果您還沒有猜到,我會顯示人名)。兩個請求中的「偏移量」,「最大值」和「排序」值是相同的。
任何幫助表示讚賞。謝謝,
安德魯
更新....
這裏是更直接的方法應該工作,除非我收到一個異常。如果我刪除'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)
at ClientContactController $ _closure21_closure39_closur e44.doCall(ClientContactController:494)
這對我來說不起作用,因爲我需要一個關聯表的別名。由於ClientContact有一個與它關聯的Client對象,如果我想通過它的Client.Name對ClientContact進行排序,我需要爲Client表創建一個別名。這就是爲什麼我最終使用Hibernate標準構建器。 – anschoewe 2009-03-09 19:19:20