Hibernate HQL: получить количество результатов, не возвращая их - PullRequest
17 голосов
/ 04 февраля 2010

Я хочу получить количество результатов динамически сгенерированного запроса HQL без фактического получения списка результатов. Скажем, что у меня есть запрос что-то вроде:

select Company company LEFT OUTER JOIN FETCH products product

Я прочитал в документации Hibernate, что:

Вы можете подсчитать количество результатов запроса, не возвращая их:

( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()

Я подозревал, что должен заменить .... своим запросом, но это не работает, поскольку HQL не поддерживает подвыборы в FROM.

Итак, как мне считать результаты динамически сгенерированного HQL-запроса? Я думаю, что его выполнение и получение .size () из списка результатов может оказаться ненужным.

Ура!

** ОБНОВЛЕНИЕ: **

Я использовал это регулярное выражение для преобразования моего запроса:

Number num = (Number) em.createQuery(dynamicQuery.replaceAll("select \\w+ from ", "select count(*) from ")).getSingleResult();

И я получаю это:

Blockquote

EJB Исключение:; Вложенное исключение: java.lang.IllegalArgumentException: org.hibernate.QueryException: в запросе указана выборка соединения, но владелец извлеченной ассоциации отсутствует в списке выбора [FromElement {явный, не объединение в коллекцию, извлечение в соединении, извлечение не свойства -lazy, classAlias ​​= product, role = org.myCompany.applicant.entity.Applicant.products, tableName = PRS_DEV.PRODUCT, tableAlias ​​= products1_, origin = PRS_DEV.APPLICANT заявитель0_, colums = {заявитель0_.APPLICANT_ID, или className. myCompany.product.entity.Product}}] [ выберите количество () из org.myCompany.applicant.entity.Applicant соискатель LEFT OUTER JOIN FETCH заявитель.продукты product ]; Вложенное исключение: java.lang.IllegalArgumentException: org.hibernate.QueryException: в запросе указана выборка соединения, но владелец извлеченной ассоциации отсутствует в списке выбора [FromElement {явный, не объединение в коллекцию, извлечение в соединении, извлечение не свойства -lazy, classAlias ​​= product, role = org.myCompany.applicant.entity.Applicant.products, tableName = PRS_DEV.PRODUCT, tableAlias ​​= products1_, origin = PRS_DEV.APPLICANT заявитель0_, colums = {заявитель0_.APPLICANT_ID, или className. myCompany.product.entity.Product}}] [выберите количество () из org.myCompany.applicant.entity.Applicant заявителя СЛЕДУЮЩАЯ СОВМЕСТНАЯ СБРОС Кандидат.продукта продукта]

Ответы [ 2 ]

13 голосов
/ 04 февраля 2010

Это должно сработать:

select count(*) FROM Company c JOIN ...

Нет никакого подвыбора, просто вместо возврата Company вы возвращаете счет.

Редактировать: FETCH сейчас не на своем месте. Вы не возвращаете сущности из запроса, а только счетчик, таким образом, жалуется Hibernate. Удаление должно помочь:

select count(product) from org.myCompany.applicant.entity.Applicant applicant 
    LEFT OUTER JOIN applicant.products product
12 голосов
/ 15 июня 2011

Вы можете получить количество результатов запроса, используя:

criteria.setProjection(Projections.rowCount());
count=(Long) criteria.uniqueResult();

надеюсь, это поможет

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