1

我正在我的 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)

4

1 回答 1

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”属性来简化分页。

于 2009-03-05T11:07:41.967 回答