true show_sql query queries property name log hibernate hql

query - property name hibernate show_sql true</ property



Hibernate HQL: obtenga la cuenta de los resultados sin devolverlos realmente (2)

Esto debería funcionar:

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

No hay una sub-selección involucrada, solo en lugar de devolver la Company , devuelve el recuento.

Edit: El FETCH está fuera de lugar ahora. No está devolviendo las entidades de la consulta, sino solo el recuento, por lo tanto, se queja Hibernate. Quitarlo debería ayudar:

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

Quiero obtener el recuento de los resultados de una consulta HQL generada dinámicamente, sin obtener realmente la lista de resultados. Digamos que la consulta que tengo es algo como:

select Company company LEFT OUTER JOIN FETCH products product

Leí 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()

Sospeché que debería reemplazar el .... con mi consulta, pero eso no funciona, ya que HQL no admite las subselecciones en FROM.

Entonces, ¿cómo debo contar los resultados de una consulta HQL generada dinámicamente? Creo que ejecutarlo y obtener el .size () de la lista de resultados puede ser una sobrecarga innecesaria.

¡Aclamaciones!

** ACTUALIZACIÓN: **

Utilicé esta expresión regular para convertir mi consulta:

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

Y entiendo esto:

Blockquote

Excepción EJB:; la excepción anidada es: java.lang.IllegalArgumentException: org.hibernate.QueryException: búsqueda especificada de unión de unión, pero el propietario de la asociación buscada no estaba presente en la lista de selección [FromElement {explícito, no una colección de recolección, captura de unión, búsqueda de captura no -lazy properties, classAlias ​​= product, role = org.myCompany.applicant.entity.Applicant.products, tableName = PRS_DEV.PRODUCT, tableAlias ​​= products1_, origin = PRS_DEV.APPLICANTIRIR0_, columnas = {solicitante0_.APPLICANT_ID, className =. myCompany.product.entity.Product}}] [ select count ( ) from org.myCompany.applicant.entity.Applicant solicitante IZQUIERDA ÚNICAMENTE ÚNASE AL PRODUCTO . la excepción anidada es: java.lang.IllegalArgumentException: org.hibernate.QueryException: búsqueda especificada de unión de unión, pero el propietario de la asociación buscada no estaba presente en la lista de selección [FromElement {explícito, no una colección de recolección, captura de unión, búsqueda de captura no -lazy properties, classAlias ​​= product, role = org.myCompany.applicant.entity.Applicant.products, tableName = PRS_DEV.PRODUCT, tableAlias ​​= products1_, origin = PRS_DEV.APPLICANTIRIR0_, columnas = {solicitante0_.APPLICANT_ID, className =. myCompany.product.entity.Product}}] [select count () from org.myCompany.applicant.entity.Applicant Applicante IZQUIERDA EXTERIOR ÚNASE AL FETCH. Producto de request.products]


puede obtener el recuento del resultado de la consulta utilizando:

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

espero que esto ayude