Hibernate 5.2 CriteriaQuery Подзапрос - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть Java-код, который использует Hibernate 5.2 CriteriaBuilder. Код возвращает этот оператор SQL ниже

(JAVA)

   CriteriaBuilder countBuilder = session.getCriteriaBuilder();
   CriteriaQuery<Long> criteriaCount = builder.createQuery(Long.class);
   Root<Transaction> transactions = criteriaCount.from(Transaction.class);
   criteriaCount.select(builder.count(transactions));
   criteriaCount.where(generatePredicate(tRequest, countBuilder, transactions, dateFrom, dateTo));
   count = session.createQuery(criteriaCount).setMaxResults(rowNum).getSingleResult();

(SQL)

 SELECT COUNT(*)
     FROM TRANSACTIONS
   WHERE MERCHANT_ID IN (8000011) FETCH FIRST 1000 ROWS ONLY

Я хочу изменить этот Java-код так, чтобы я получил этот SQL-оператор ниже

 SELECT COUNT(*)
       FROM (SELECT *
               FROM TRANSACTIONS
              WHERE MERCHANT_ID IN (8000011) FETCH FIRST 1000 ROWS ONLY)

Пожалуйста, дайте мне знать, как его изменить.

Кроме того, в Hibernate 3 была возможность добавить ограничение SQL для «Критерия», как это

criterionFilter =  Restrictions.and(criterionFilter, Restrictions.sqlRestriction("rownum <= ?", 1000, StandardBasicTypes.INTEGER))

возможно ли это в спящем режиме 5?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Сгенерированный запрос

 SELECT COUNT(*)
     FROM TRANSACTIONS
   WHERE MERCHANT_ID IN (8000011) FETCH FIRST 1000 ROWS ONLY

обеспечивает абсолютно бессмысленно , select count(*) возвращает ровно одну строку, поэтому нет никаких оснований ограничивать число выбранных строк до 1000 .

Таким образом, единственное правильное действие - открыть билет спящим людям. Тем временем используйте обходной путь , если вы получите count, превышающее 1000, просто сократите его до 1000. Вы получите ожидаемый результат.

0 голосов
/ 12 ноября 2018

Учитывая следующий ответ / вопросы:

  1. Рефакторинг собственного запроса в JPQL-запрос
  2. JPA / Hibernate подзапрос из предложения

это невозможно сделать в JPQL. К сожалению, это сильное ограничение. Вам следует рассмотреть возможность использования собственного запроса для выполнения того или иного подхода, например представления.

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