Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate Grails分页结果不一致_Hibernate_Grails_Gorm_Paging - Fatal编程技术网

Hibernate 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

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

在 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标准构建器的原因。我希望您的代码能够正常工作,但无法编译。我已经更新了我原来的帖子。您可以看到我是如何实现您的示例的。我还包括了我收到的例外情况。但我同意你的看法,这应该行得通。