Подтвердить что ты не робот

Hibernate HQL: получить количество результатов без фактического возврата их

Я хочу получить подсчет результатов динамически генерируемого запроса 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 Exception:; Вложенное исключение: java.lang.IllegalArgumentException: org.hibernate.QueryException: запрос заданного объединения, но владелец выбранной ассоциации не присутствовал в списке выбора [FromElement {явный, а не объединение коллекции, выборка соединения, -lazy properties, classAlias ​​= product, role = org.myCompany.applicant.entity.Applicant.products, tableName = PRS_DEV.PRODUCT, tableAlias ​​= products1_, origin = PRS_DEV.APPLICANT кандидат0_, colums = {subscription0_.APPLICANT_ID, className = org. myCompany.product.entity.Product}}] [ выберите count() из org.myCompany.applicant.entity.Applicant заявитель LEFT OUTER JOIN FETCH product.products product]; Вложенное исключение: java.lang.IllegalArgumentException: org.hibernate.QueryException: запрос заданного объединения, но владелец выбранной ассоциации не присутствовал в списке выбора [FromElement {явный, а не объединение коллекции, выборка соединения, -lazy properties, classAlias ​​= product, role = org.myCompany.applicant.entity.Applicant.products, tableName = PRS_DEV.PRODUCT, tableAlias ​​= products1_, origin = PRS_DEV.APPLICANT кандидат0_, colums = {subscription0_.APPLICANT_ID, className = org. myCompany.product.entity.Product}}] [select count() from org.myCompany.applicant.entity.Applicant заявитель LEFT OUTER JOIN FETCH Заявитель.продукты продукт]

4b9b3361

Ответ 1

Это должно сделать трюк:

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

Ответ 2

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

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

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