Quiero obtener el recuento de los resultados de una consulta HQL generada dinámicamente, sin obtener realmente la lista de resultados. Decir que la consulta que tengo es algo así como:Hibernate HQL: obtenga el recuento de los resultados sin devolverlos realmente
select Company company LEFT OUTER JOIN FETCH products product
leí en la documentación de Hibernate que:
Se puede contar el número de resultados de la consulta sin devolverlos:
((Integer) session.createQuery("select count(*) from ....").iterate().next()).intValue()
Sospeché que debería reemplazar el .... con mi consulta, pero eso no funciona, ya que HQL no admite ort sub-selecciona en FROM.
Entonces, ¿cómo debo contar los resultados de una consulta HQL generada dinámicamente? Creo que al ejecutarlo y obtener .size() de la lista de resultados puede ser una sobrecarga innecesaria.
¡Salud!
** ACTUALIZACIÓN: **
He utilizado esta expresión regular para convertir mi consulta:
Number num = (Number) em.createQuery(dynamicQuery.replaceAll("select \\w+ from ", "select count(*) from ")).getSingleResult();
Y me sale esto:
cita en bloque Excepción
EJB:; La excepción anidada es: java.lang.IllegalArgumentException: org.hibernate.QueryException: la consulta especificó la recuperación de uniones, pero el propietario de la asociación recuperada no estaba presente en la lista de selección [FromElement {explicit, no es un join de colección, fetch join, fetch join -lazy properties, classAlias = product, role = org.myCompany.applicant.entity.Applicant.products, tableName = PRS_DEV.PRODUCT, tableAlias = products1_, origin = PRS_DEV.APPLICANT candidate0_, colums = {solicitante0_.APPLICANT_ID, className = org. myCompany.product.entity.Product}}] [select count () de org.myCompany.applicant.entity.Applicant candidate LEFT OUTER JOIN FETCH solicitante.products product]; La excepción anidada es: java.lang.IllegalArgumentException: org.hibernate.QueryException: la consulta especificó la recuperación de uniones, pero el propietario de la asociación recuperada no estaba presente en la lista de selección [FromElement {explicit, no es un join de colección, fetch join, fetch join -lazy properties, classAlias = product, role = org.myCompany.applicant.entity.Applicant.products, tableName = PRS_DEV.PRODUCT, tableAlias = products1_, origin = PRS_DEV.APPLICANT candidate0_, colums = {solicitante0_.APPLICANT_ID, className = org. myCompany.product.entity.Product}}] [select count () del solicitante org.myCompany.applicant.entity.Applicant LEFT OUTER JOIN FETCH applicant.products producto]
Sí, me han tratado de eso. Obtengo una excepción: QueryException: la consulta especificó la recuperación de uniones, pero el propietario de la asociación recuperada no estaba presente en la lista de selección. Ver mi updte para el seguimiento completo de la pila –
@Markos: He actualizado mi respuesta. – Henning
Gracias, hombre, funcionó! –