一、项目环境: 
1、数据库:oracle 10g 
2、ORM框架:hibernate 3 二、问题描述 
1、查询时希望能够在对数据排序后取前100条,由于项目已经使用hibernate,所以希望通过小的改造实现上述功能。 2、oracle 不支持例如sql server那样的 top N 语法,目前只知道可以用子查询实现,如 select * from  (select * from order o2  order by o2.group_id  desc  ) where  rownum<100;或者 
select * from (    
              select o.*,ROW_NUMBER() over (order by o.group_id  desc) MM from order o    
              )    
          where MM<100;   3、hibernate 不支持子查询,直接将SQL转换成HQL语句,语法错误 

解决方案 »

  1.   

    直接利用hibernate的查询可以吗?
    Query query =se.createQuery(hql);
    query.setFirstResult(1);
    query.setMaxResults(100);
    List ret = query.list();
      

  2.   

    对啊!   hibernate的话直接就能取排序的前多少条,不用写那么麻烦的SQL语句!
      

  3.   

    这个我知道,分页功能就是基于楼上说的做的。但是当结果集有几十万条的时候,即使用setMaxResults(10)设置了分页显示,query.list()响应速度依然很慢,求解?
      

  4.   

    对于oracle 来说就算你用 rownum 来进行分页也会存在效率问题oracle sh用户下有个sales表,有100多万的数据。用rownum查第一页很快,最后一页时很慢,你可以试一下
      

  5.   

    几十万 不会这么慢吧 
    如果数据量大 肯定是得用存储过程进行分页的
    而且rownum 这个值生成的时候 本身就要全表扫描的
      

  6.   

    通过测试发现如果将查询的order by 条件去掉,查询速度显著提升,看来这个也是关键瓶颈。
      

  7.   

    ---表结构 
    CREATE TABLE ORDER  ( 
       ID                   INTEGER                         NOT NULL, 
       ORDER_NO         VARCHAR2(50), 
       GROUP_ID             INTEGER, 
       SUB_GROUP_MARK_NO    INTEGER,   
       TRAN_TYPE            INTEGER, 
       STATUS               INTEGER 
       CONSTRAINT PK_AIRTICKET_OR PRIMARY KEY (ID) 
    ); CREATE TABLE ORDER_GROUP  ( 
       ID                   INTEGER                         NOT NULL, 
       NO                   VARCHAR2(20), 
       FIRST_DATE           DATE, 
       LAST_DATE            DATE, 
       STATUS               INTEGER, 
       CONSTRAINT PK_ORDER_GROUP PRIMARY KEY (ID) 
    ); ALTER TABLE AIRTICKET_ORDER 
       ADD CONSTRAINT FK_AIRTICKE_REF FOREIGN KEY (GROUP_ID) 
          REFERENCES ORDER_GROUP (ID); 经分析,发现是查询order表时order by order_group.id 消耗的时间最大 
      

  8.   

    更正下上面的SQL脚本,应该是
    ALTER TABLE ORDER  
      ADD CONSTRAINT FK_ORDER_REF FOREIGN KEY (GROUP_ID)  
      REFERENCES ORDER_GROUP (ID);  
      

  9.   

    用createSQLquery 用sql语句查询试试