我在hibernate中用setFirstResult setMaxResult 
List items = criteria.setFirstResult((pageno - 1) * pageSize).setMaxResults(pageSize).list();
这样我只能实现翻页,但数据太多有7W条且关联表多,翻到最后一页时非常慢。
我现在想只查询出前500条数据来分页,有什么好办法。
谢谢各位!

解决方案 »

  1.   

    我可以在代码里配置减少关联对象?
    如查询task列表时,我需要servicerequest对象关联,但servicerequest有关联着个多的别的关联,我如何控制servicerequest只取我想要的数据?
    <hibernate-mapping package="com.newchina.po">
        <class name="Task" table="Task" dynamic-insert="true" dynamic-update="true">
            <id name="id" type="java.lang.Integer">
                <column name="ID" />
                <generator class="native" />
            </id>
    ......
            <many-to-one name="serviceRequest" column="ServiceRequest" class="ServiceRequest" cascade="none"  />
      

  2.   

    还有最重要的问题,我如何用hibernate控制只在前500条数据翻页????????我最想知道这个。
      

  3.   

    你在hql后面加个条件 rowid < 50可以么?
      

  4.   

    如果数据库是oracle的话可以加一条:
    criteria.add(Restrictions.sqlRestriction("ROWNUM <= 500"))
      

  5.   

    很简单。
    int maxRecords = 500;
    int startNum = (pageNo - 1)* pageSize;
    int endNum = (maxRecords - startNum) % pageSize;if (endNum <= 0) {    //超出最大数据量
        //不用搜索
    }
    else {
      List items = criteria.setFirstResult(startNum).setMaxResults(endNum).list();}
      

  6.   

    谢谢了,你这样还是会查询统计所有的记录,只是不让翻页到500条记录以后,而已!
    大虾么,没有更好的办法么?我的数据库是sqlserver 2005.当然用sql可以,但我不想用sql
      

  7.   


    实际上这个问题可以搜索下 因为用过HIBERNATE的人应该知道 SQLSERVER 都是用伪分页实现的 (用TOP不能达到完美) 他先是用TOP查询 然后再在内存中进行假分页不过2005就好多了 因为有了类似Oracle的rownum的函数 
    http://blog.csdn.net/tdl982324/archive/2008/07/03/2607674.aspx
    需要重写方言
      

  8.   

    我现在有1w多条记录。
    没出现过lz这样的情况。。关联表一样很多!这样我只能实现翻页,但数据太多有7W条且关联表多,翻到最后一页时非常慢
    能发表下看法吗?因为7w多条记录,到了后面越来越慢.!这句。为什么会越来越慢呢! 我倒是很想知道.因为我没出现这种现象!