Grails分页结果不一致

时间:2009-03-04 19:10:35

标签: grails paging

我正在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异常:   拨打[list]不支持

     

在   grails.orm.HibernateCriteriaBuilder.invokeMethod(HibernateCriteriaBuilder.java:847)

     

在   ClientContactController $ _closure21_closure39_closure44.doCall(ClientContactController:494)

1 个答案:

答案 0 :(得分:0)

我不知道为什么排序在不同请求中不一致,但我想向您展示代码的“默认”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%"
        }
    }
}

结果变量是PagedResultList的一个实例,它基本上是一个普通的列表,但是有一个“totalCount”属性来简化分页。