В моем коде у меня есть этот общий запрос на спящий режим с запросом на список критериев для выбора поля выбора и задайте результат первого/максимального значения для ограничения числа строк.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 < ?
как я могу изменить свой код?
Спасибо Тьерри. – Gibi