2016-06-01 5 views
0

В моем коде у меня есть этот общий запрос на спящий режим с запросом на список критериев для выбора поля выбора и задайте результат первого/максимального значения для ограничения числа строк.select with sub select при использовании 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; 
} 

Однако, без ограничения числа строк каждая вещь выглядит отлично, как показано в SQL-журнале.

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=? 

Во всяком случае, когда я ограничить число строк, то SQL как следовать

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 < ? 

я получил выбрать с суб выбрать

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

ли этот нормальный спящий режим? Или я сделал что-то не так? Если я хочу

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

как я могу изменить свой код?

ответ

1

Это общий способ получения первой страницы набора результатов с помощью oracle.

Это эквивалентно запросу, который вы ожидали от спящего режима.

Обратите внимание, что при применении поискового вызова по запросу вы должны отсортировать полный набор результатов, иначе вы можете получать разные результаты при каждом запуске запроса.

Порядок пункт будет поместить внутри суб-выбор спящего режима генерируемого (сортировать полный набор результатов, перед тем ограничение на страницу этого):

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