Quiero obtener el recuento de los resultados de un generadas dinámicamente consulta HQL, sin llegar a obtener la lista de resultados. Decir que la consulta que tengo es algo así como:

select Company company LEFT OUTER JOIN FETCH products product

He leído en la documentación de Hibernate que:

Puede contar el número de resultados de la consulta sin devolverlos:

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

Yo sospechaba que yo debería ser la sustitución de la …. con mi consulta, pero que no funciona, como HQL no admite sub-selecciona en DE.

Así que, ¿cómo debo contar los resultados de un generadas dinámicamente consulta HQL? Creo que por la ejecución y obtener los .size() de la lista de resultados puede ser una sobrecarga innecesaria.

Saludos!

**ACTUALIZACIÓN: **

He utilizado esta expresión para convertir mi consulta:

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

Y me sale esto:

Blockquote

EJB Excepción: ; excepciones anidadas es: java.lang.IllegalArgumentException: org.hibernate.QueryException: consulta especificada unirse a ir a buscar, pero el dueño de la traída de la asociación no estaba presente en la lista de selección [FromElement{explícita,y no una colección de unirse,fetch unirse,fetch, no perezoso properties,classAlias=product,role=org.myCompany.applicant.entity.Applicant.products,tableName=PRS_DEV.PRODUCT,tableAlias=products1_,origin=PRS_DEV.SOLICITANTE applicant0_,columnas={applicant0_.APPLICANT_ID ,className=org.myCompany.producto.entidad.Producto}}] [select count() de la org.myCompany.solicitante.entidad.Solicitante solicitante LEFT OUTER JOIN FETCH solicitante.productos producto ]; excepciones anidadas es: java.lang.IllegalArgumentException: org.hibernate.QueryException: consulta especificada unirse a ir a buscar, pero el dueño de la traída de la asociación no estaba presente en la lista de selección [FromElement{explícita,y no una colección de unirse,fetch unirse,fetch, no perezoso properties,classAlias=product,role=org.myCompany.applicant.entity.Applicant.products,tableName=PRS_DEV.PRODUCT,tableAlias=products1_,origin=PRS_DEV.SOLICITANTE applicant0_,columnas={applicant0_.APPLICANT_ID ,className=org.myCompany.producto.entidad.Producto}}] [select count() de la org.myCompany.solicitante.entidad.Solicitante solicitante LEFT OUTER JOIN FETCH solicitante.productos producto ]

2 Comentarios

  1. 13

    Esto debe hacer el truco:

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

    No hay sub-select, solo en lugar de devolver Company, te devuelven la cuenta.

    Edición: La FETCH está fuera de lugar ahora. No estás regresando a las entidades de la consulta, pero sólo el recuento, por lo tanto, Hibernate se queja. La eliminación debe ayudar a:

    select count(product) from org.myCompany.applicant.entity.Applicant applicant 
        LEFT OUTER JOIN applicant.products product
    • Sí, he intentado. Puedo obtener una excepción: QueryException: consulta especificada unirse a ir a buscar, pero el dueño de la traída de la asociación no estaba presente en la lista de selección. Ver a mi updte para el completo seguimiento de la pila
    • He actualizado mi respuesta.
    • Gracias hombre, funcionó!
  2. 12

    usted puede obtener el recuento de los resultados de la consulta mediante el uso de:

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

    espero que esto ayude

    • Esto no ayuda. El rowCount() método pertenece a la API de Criterios, pero el OP es el uso de HQL.
    • He buscado por los Criterios de la API para «contar» y esta sugerencia fue útil para mí.

Dejar respuesta

Please enter your comment!
Please enter your name here