2016-06-01 6 views
0

私のコードでは、選択フィールドをリストし、行番号を制限するために最初/最大結果を設定する基準投影リストを持つこの一般的なハイバネートクエリを持っています。 SQLログに示すようにrownum(Java Hibernate Persistence)を使用する場合はサブ選択で選択してください

private Criteria getCriteria(Status status, Class<?> T, String aliasName, String subTable, String subAlias, List<Criterion> criterionList, List<Order> orderList, ProjectionList projectionList, Integer firstResult, Integer maxResult, Session session) { 
    StringBuilder methodFullNameSb = new StringBuilder("Criteria: getCriteria(Status, Class<?>, String, String, String, List<Criterion>, List<Order>, ProjectionList,Integer, Integer)"); 
    MethodLevelLogger methodLevelLogger = MethodLevelLogger.getCurrentInstance(methodFullNameSb.toString()); 
    methodLevelLogger.start(); 

    Criteria criteria = null; 
    try { 
     criteria = session.createCriteria(T, aliasName); 
     if (subAlias != null && !subAlias.isEmpty()) { 
      criteria.createAlias(subTable, subAlias).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).setReadOnly(true); 
     } 

     if (criterionList != null) { 
      for (Criterion criterion : criterionList) { 
       criteria.add(criterion); 
      } 
     } 

     if (orderList != null) { 
      for (Order order : orderList) { 
       criteria.addOrder(order); 
      } 
     } 

     //to setlect field 
     if (projectionList != null) { 
      criteria.setProjection(projectionList); 
     } 

     //to limit row number 
     if (firstResult != null && maxResult != null) { 
      criteria.setFirstResult(firstResult); 
      criteria.setMaxResults(maxResult); 
     } 
     // Set Cache MODE DISABLE 
     criteria.setCacheMode(CacheMode.IGNORE).setReadOnly(true); 

    } catch (HibernateException | NullPointerException e) { 
     ApplicationExceptionHandle.doApplicationExceptionHandleAPP001withStackTrace(status, e, log); 
    } catch (Exception exception) { 
     ApplicationExceptionHandle.doApplicationExceptionHandleAPP001withStackTrace(status, exception, log); 
    } 

    methodLevelLogger.end(); 
    log.debug(methodLevelLogger.getMessageTimeDiff()); 
    return criteria; 
} 

しかし、リミット行番号なしですべてのものが正常に見えます。とにかく

2016-05-31 16:49:41,769 INFO [stdout]:71 - Hibernate: 
2016-05-31 16:49:41,769 INFO [stdout]:71 -  /* criteria query */ select 
2016-05-31 16:49:41,769 INFO [stdout]:71 -   /*+index(this_  ORDHIS_IDX)*/ this_.ORDER_HISTORY_ID as H_ORDER_HISTORY_ID, 
2016-05-31 16:49:41,769 INFO [stdout]:71 -   this_.ORDER_TRAN_ID as y1_, 
2016-05-31 16:49:41,769 INFO [stdout]:71 -   this_.UUID as y2_, 
2016-05-31 16:49:41,769 INFO [stdout]:71 -   this_.MOBILE_NO as y3_, 
2016-05-31 16:49:41,769 INFO [stdout]:71 -   this_.MOBILE_SEGMENT as y4_,... 
2016-05-31 16:49:41,779 INFO [stdout]:71 -  from 
2016-05-31 16:49:41,779 INFO [stdout]:71 -   suiadm.SSC_ORDER_HISTORY this_, 
2016-05-31 16:49:41,779 INFO [stdout]:71 -   suiadm.SSC_ORDER_ITEM orderitems1_ 
2016-05-31 16:49:41,779 INFO [stdout]:71 -  where 
2016-05-31 16:49:41,779 INFO [stdout]:71 -   this_.ORDER_HISTORY_ID=orderitems1_.ORDER_HISTORY_ID 
2016-05-31 16:49:41,779 INFO [stdout]:71 -   and this_.CREATE_BY=? 
2016-05-31 16:49:41,779 INFO [stdout]:71 -   and this_.SFF_STATUS in (
2016-05-31 16:49:41,779 INFO [stdout]:71 -    ?, ?, ?, ? 
2016-05-31 16:49:41,779 INFO [stdout]:71 -  ) 
2016-05-31 16:49:41,779 INFO [stdout]:71 -   and this_.MOBILE_SEGMENT in (
2016-05-31 16:49:41,779 INFO [stdout]:71 -    ?, ? 
2016-05-31 16:49:41,779 INFO [stdout]:71 -  ) 
2016-05-31 16:49:41,779 INFO [stdout]:71 -   and this_.CREATE_DATE between ? and ? 
2016-05-31 16:49:41,779 INFO [stdout]:71 -   and orderitems1_.EFF_CODE in (
2016-05-31 16:49:41,779 INFO [stdout]:71 -    ?, ? 
2016-05-31 16:49:41,779 INFO [stdout]:71 -  ) 
2016-05-31 16:49:41,779 INFO [stdout]:71 -   and this_.SERVICE_TYPE=? 

、私は行数を制限する場合

2016-05-31 17:00:46,561 INFO [stdout]:71 - Hibernate: 
    2016-05-31 17:00:46,561 INFO [stdout]:71 -  select 
    2016-05-31 17:00:46,561 INFO [stdout]:71 -   * 
    2016-05-31 17:00:46,561 INFO [stdout]:71 -  from 
    2016-05-31 17:00:46,561 INFO [stdout]:71 -   (/* criteria query */ select 
    2016-05-31 17:00:46,561 INFO [stdout]:71 -    /*+index(this_ ORDHIS_IDX)*/ this_.ORDER_HISTORY_ID as H_ORDER_HISTORY_ID, 
    2016-05-31 17:00:46,561 INFO [stdout]:71 -    this_.ORDER_TRAN_ID as y1_, 
    2016-05-31 17:00:46,561 INFO [stdout]:71 -    this_.UUID as y2_, 
    2016-05-31 17:00:46,561 INFO [stdout]:71 -    this_.MOBILE_NO as y3_, 
    2016-05-31 17:00:46,561 INFO [stdout]:71 -    this_.MOBILE_SEGMENT as y4_,..... 
    2016-05-31 17:00:46,579 INFO [stdout]:71 -   from 
    2016-05-31 17:00:46,580 INFO [stdout]:71 -    suiadm.SSC_ORDER_HISTORY this_, 
    2016-05-31 17:00:46,580 INFO [stdout]:71 -    suiadm.SSC_ORDER_ITEM orderitems1_ 
    2016-05-31 17:00:46,580 INFO [stdout]:71 -   where 
    2016-05-31 17:00:46,580 INFO [stdout]:71 -    this_.ORDER_HISTORY_ID=orderitems1_.ORDER_HISTORY_ID 
    2016-05-31 17:00:46,580 INFO [stdout]:71 -    and this_.MOBILE_NO=? 
    2016-05-31 17:00:46,581 INFO [stdout]:71 -    and this_.SFF_STATUS in (
    2016-05-31 17:00:46,582 INFO [stdout]:71 -     ?, ?, ?, ? 
    2016-05-31 17:00:46,582 INFO [stdout]:71 -   ) 
    2016-05-31 17:00:46,582 INFO [stdout]:71 -    and this_.MOBILE_SEGMENT in (
    2016-05-31 17:00:46,582 INFO [stdout]:71 -     ?, ? 
    2016-05-31 17:00:46,583 INFO [stdout]:71 -   ) 
    2016-05-31 17:00:46,583 INFO [stdout]:71 -    and this_.CREATE_DATE between ? and ? 
    2016-05-31 17:00:46,583 INFO [stdout]:71 -    and orderitems1_.EFF_CODE in (
    2016-05-31 17:00:46,583 INFO [stdout]:71 -     ?, ? 
    2016-05-31 17:00:46,583 INFO [stdout]:71 -   ) 
    2016-05-31 17:00:46,583 INFO [stdout]:71 -    and this_.SERVICE_TYPE=?) 
    2016-05-31 17:00:46,584 INFO [stdout]:71 -  where 
    2016-05-31 17:00:46,584 INFO [stdout]:71 -   rownum <= ? 

代わりの

select ... from ... where criteria1 and criteria2 and rownum < ? 

に従うように、SQLは、私は、サブ選択

select ... from select ... from where creiterai1 and criteria2 where rownum < ? 

ですと選択しましたですこの通常の休止状態ですか?または私は何か間違ったことをしましたか?必要ならば

select ... from ... where criteria1 and criteria2 and rownum < ? 

私のコードを編集するにはどうすればよいですか?

答えて

1

これは、oracleを使用して結果セットの最初のページを取得する一般的な方法です。

これは、生成するために休止状態になると思われるクエリに相当します。

クエリでページングを適用する場合は、完全な結果セットをソートする必要があります。そうしないと、クエリを実行するたびに結果が異なることに注意してください。

ORDER BY句が生成されたサブ選択休止状態(あなたがそれのページに制限する前に、完全な結果セットを並べ替える)の内側に置かれる:

select 
    * 
from 
    (/* criteria query */ select 
     /*+index(this_ ORDHIS_IDX)*/ this_.ORDER_HISTORY_ID as H_ORDER_HISTORY_ID, 
     this_.ORDER_TRAN_ID as y1_, 
     this_.UUID as y2_, 
     this_.MOBILE_NO as y3_, 
     this_.MOBILE_SEGMENT as y4_,..... 
    from 
     suiadm.SSC_ORDER_HISTORY this_, 
     suiadm.SSC_ORDER_ITEM orderitems1_ 
    where 
     this_.ORDER_HISTORY_ID=orderitems1_.ORDER_HISTORY_ID 
     and this_.MOBILE_NO=? 
     and this_.SFF_STATUS in (
      ?, ?, ?, ? 
     ) 
     and this_.MOBILE_SEGMENT in (
      ?, ? 
     ) 
     and this_.CREATE_DATE between ? and ? 
     and orderitems1_.EFF_CODE in (
      ?, ? 
     ) 
     and this_.SERVICE_TYPE=? 
    **order by ...** 
) 
where 
    rownum <= ? 
+0

はあなたにティエリありがとうございます。 – Gibi

関連する問題