Java Hibernate Query以批处理模式返回重复结果

时间:2014-06-02 23:56:14

标签: java hibernate

我在DAO中使用以下方法使用hibernate查询DB(oracle),每次查询批量加载50行数据。 batchSize设置为50,batchNumber设置为1,SortOrder对象的isAscending设置为true,columnName等于行中的一列。

出于某种原因,在前50个结果中,跳过35-40行,然后从第2个查询的第51行开始,我得到重复的结果。

评论有关SortOrder的逻辑修复了重复的问题,但我不明白为什么我会得到重复的结果.....任何帮助将不胜感激。

public List<Cats> getCatsList(CatQueryCriteria params)
{
   List<Cat> cats= new ArrayList<Cat>();
   Session sess = (Session) em.getDelegate();
   Criteria criteria = sess.createCriteria(Cat.class, "cat");
   //Returns list of catIDs
   List<Long> catIDList = catInfo.returnCatIDs(sess, params);
   //Eliminate duplicates
   criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE);

   if(catIDList.size() != 0)
   {
      //Add criteria
      criteria.add(Restrictions.in("cat.catID", catIDList));

      //Add in Sort Order
      if(params.getSortOrder() != null)
      {
          for (SortOrder order: params.getSortOrder())
          {
              if(order.isAscending())
              {
                 criteria.addOrder(Order.asc(order.getColumnName()));
              }
              else
              {
                 criteria.addOrder(Order.desc(order.getColumnName()));
              }
          }
      }

     //Batch loading

     if(params.getBatchSize() > 0)
     {
         criteria.setMaxResults(params.getBatchSize());
         if (params.getBatchNumber() > 0)
         {
             criteria.setFirstResult((params.getBatchNumber()) *params.getBatchSize());
         }
      }
     //Execute query
     cats =  criteria.list();
  }
 return cats;
}

1 个答案:

答案 0 :(得分:0)

这是一个复杂的问题。 请检查此问题:

Hibernate - distinct results with pagination

同样对于criteria.setFirstResult(),索引从0开始。因此,如果将index设置为1,您将在第二页中看到结果