2009-03-04 109 views
0

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

回答

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

+0

这对我来说不起作用,因为我需要一个关联表的别名。由于ClientContact有一个与它关联的Client对象,如果我想通过它的Client.Name对ClientContact进行排序,我需要为Client表创建一个别名。这就是为什么我最终使用Hibernate标准构建器。 – anschoewe 2009-03-09 19:19:20