大家好,hibernate对于sqlserver的分页查询似乎有效率上的问题:Query query=session.createQuery("from User as aa ");
query.setFirstResult(0);
query.setMaxResults(15);当查询第一页的时候,发出sql语句:select top 15 ...
当查询第二页的时候,发出sql语句:select top 30 ...
当查询第三页的时候,发出sql语句:select top 45 ...
......(翻页越多,每次查询的记录数也越多,而每次查询的数目应该是一定的,就是每页记录数15.)
在mysql中,可能会发出含有limit的sql来真正意义上地限定分页查询的起始点,但在sqlserver中,上述结果明显是不合理的,我试着用hql自己写,但是似乎它不支持select top的方式,如查询第三页:
select top 15 * from user as aa where id not in (select top 30 id from user as bb) -- 这样会报错,说15没有映射这个问题如何解决?谢谢,谢谢~~

解决方案 »

  1.   

    这个效率上问题好像并没有你说的那么严重..20000页分页我也用的这个..并不会出现越翻越慢的情况..请放心使用.如果你是在想自己写的话你可以用SQL分页啊..最多使用个hibernate的SQL接口嘛..
      

  2.   

    写成jdbc 方式  
    在应用中 hql 和 jdbc 混合使用
      

  3.   

    没有问题啊,你是不是用Session的createSQLQuery()方法啊,这个才是支持自定义语句的哦
      

  4.   

    我用的包是比较上层的,封装了很多层,现在我就调用底层的原始hibernate处理sql了,多谢各位~~
      

  5.   

    Sql2000对分页这块处理比较困难,我是在存储过程中操作的,我的操作是将数据放入临时表中,并在临时表中放入一个自增id字段,以此来进行top操作,否则只根据top查询出来的翻页数据可能不准确(主要是有可能重复)。
    Sql2005就好处理多了,建议用Sql2005处理分页
      

  6.   

    sql server 2000 查询的时候就是这样,用 top 分页 出现的效率就是越往后越低,如果分页分了20000条,那么你在查前100条的时候速度还挺快,但是如果你越往后查,比如你想查最后一页,那么系统显示就稍微慢了。这些都是本来存在的问题,做过的系统,都是如此,暂时还没有什么其他的方法。不过,我曾经测试 过100万条数据,每页显示20条,共50000页,查询前面的时候速度还可以,但是后面,速度就明显的慢了点。
      

  7.   

    谢谢,sql2005是怎么样的?hibernate发出的sql语句是怎么样的?有类似mysql的limit关键字还是采用top的子查询呢?
      

  8.   

    我使用hibernate的sql方法接口了,使用top子查询,性能问题得到了缓解,但是随之而来的问题是:查出来的记录全放在数组里面,如一个含有id、name、age的User类,如果使用hibernate的hql或者query之类的,查出来是<List<Map<String, Object>>>类型;而如果使用hibernate的sql方法,查出来的结果是
    List<Object[]>类型,即pojo的属性被放在了一个数组中,需要自己重新按顺序将数组中的元素提取,重新构造一个pojo实例,唉,不过我就这样做了,目前来看性能明显提高了,不过才三十几万数据。
      

  9.   

    看你的sql语句当然是越来越多了,你的分页语句有错误,top完应该减出中间分页要查询出的那段。
      

  10.   

    lz放心用吧速度不会太慢的,我们这里也是用的Hibernate的我们这里测1000W条数据速度也不是特别慢,而且还是用的Ajax无刷新,  不过有时候点下去还是要等几十秒才有反映,应该服务器比较差的问题...