Я хочу получить подсчет результатов динамически генерируемого запроса 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 Заявитель.продукты продукт]