我利用hibernate Criteria进行组合查询分页。由于在查询过程中可能会有重复数据,所以我在Criteria中设置了c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
分页代码如下:Criteria c=this.getCriteria(bean);
c.setFirstResult(first);
c.setFetchSize(pagebean.getPageSize());
list=(List<User>)c.list(); 其中this.getCriteria(bean)是封装了查询条件的方法,中设置了c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 返回一个Criteria。如果我使用setFetchSize方法的话,会在每一页都会返回所有的数据,和没有分页一样。如果我采用setMaxSize方法的话每个页面会出现数量不等的记录。
想请高手们帮我解决一下啊。
我不是很清楚(Criteria.DISTINCT_ROOT_ENTITY)是在setMaxSize之后执行还是在之前执行。

解决方案 »

  1.   

    还是自己顶一下吧。
        网上说用setfetchsize比setmaxSize要好,但是我实际测试的时候发现并不是这样。fetchsize里面设置的数值并不是一次取出的记录数,而是一股脑而的全都显示出来了。这样一来是聋子制成哑巴了。没有达到我的目的。
        后来在网上发现用投影Projection。试了一下果然不错,不过随之而来的就是关联属性无法查询。接着找资料,最终找到了Criteria中的setAliase来给关联属性设置别名,然后在ProjectionList里面设置投影Property的时候加上关联属性的子属性之后就可以达到我的要求了。
        看来,难的不是技术,是满足一定需求的技术。
      

  2.   

    复杂的关联查询 用SQL就好了~~ 将结果集封装成对象集合就好了
      

  3.   

    //setMaxResults 是用来配合数据库生成sql的,在sql里就控制查询的记录数目
    //setFetchSize是控制查询结果的,可能sql已经查询出100条,但是hibernate只取前10条放到返回的List里
      

  4.   


    这个我知道,但是那是要自己手动生成SQL语句的。如果表的属性很多的话那样会很累的。相比而言,hibernate的Criteria还是比较方便的。而我的需求恰恰是表的属性特别的多,组合查询的条件也是特别的多。
      

  5.   

    一开始我也是这么认为的,但是我使用这个方法的时候,比方说我的表里有30条记录,我用了setFetchsize(10),但是查询出来的list大小还是30条。