2010-02-04 14 views
17

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]

Respuesta

14

Esto debería hacer el truco:

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

No hay ninguna sub selección involucrada, solo que en lugar de devolver Company, devuelve el conteo.

Edit: El FETCH está fuera de lugar ahora. No devuelve las entidades de la consulta, sino solo el conteo, por lo tanto, Hibernate se queja.Extracción debería ayudar:

select count(product) from org.myCompany.applicant.entity.Applicant applicant 
    LEFT OUTER JOIN applicant.products product 
+0

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 –

+0

@Markos: He actualizado mi respuesta. – Henning

+0

Gracias, hombre, funcionó! –

12

se puede obtener el recuento del resultado de la consulta mediante el uso de:

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

esperanza esto ayuda

+4

Esto no ayuda. El método rowCount() pertenece a la API de Criteria, pero el OP está utilizando HQL. – jjmontes

+5

Busqué Criteria API para 'contar' y esta sugerencia fue útil para mí. –

Cuestiones relacionadas