Soy nuevo en JPA y quiero implementar un DAO JPA genérico y necesito encontrar el número de filas de un conjunto de resultados de consulta para implementar la paginación. Después de buscar en la web, no puedo encontrar una forma práctica de hacerlo. Aquí está el código sugerido en muchos artículos:¿Cómo contar el número de filas de un JPA 2 CriteriaQuery en un JPA DAO genérico?
public <T> Long findCountByCriteria(CriteriaQuery<?> criteria) {
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Long> countCriteria = builder.createQuery(Long.class);
Root<?> entityRoot = countCriteria.from(criteria.getResultType());
countCriteria.select(builder.count(entityRoot));
countCriteria.where(criteria.getRestriction());
return em.createQuery(countCriteria).getSingleResult();
}
Sin embargo, ese código no funciona cuando se utiliza join
. ¿Hay alguna forma de contar las filas de un conjunto de resultados de consulta utilizando la API de criterios de JPA?
ACTUALIZACIÓN: Este es el código que crean CriteriaQuery:
CriteriaQuery<T> queryDefinition = criteriaBuilder.createQuery(this.entityClass);
Root<T> root = queryDefinition.from(this.entityClass);
y algunos se une puede ser añadido a la raíz hasta que la consulta se ha ejecutado:
public Predicate addPredicate(Root<T> root) {
Predicate predicate = getEntityManager().getCriteriaBuilder().ge(root.join(Entity_.someList).get("id"), 13);
return predicate;
}
y la excepción generada es como:
org.hibernate.hql.ast.QuerySyntaxException: Ruta no válida: 'generatedAlias1.id' [select count (generatedAlias0) de entity.Entity como generatedAlias0 donde (generatedAlias0.id> = 13L) y ( (generatedAlias1.id < = 34L))]
que generatedAlias1 debe estar en Entity y generatedAlias0 debería estar en la asociación a la que me uní en eso. Tenga en cuenta que implemento Join correctamente porque cuando ejecuto la consulta sin la consulta de recuento se ejecuta sin error y la unión funciona correctamente, pero cuando intento ejecutar la consulta de recuento se lanza una excepción.
¿Puede mostrarnos cómo ha definido CriteriaQuery > criterios – perissf
@perissf He actualizado la publicación. – stacker
Vea otras respuestas a problemas similares: http://stackoverflow.com/questions/9001289/jpa-hibernate-criteriabuilder-how-to-create-query-using-relationship-object/9002225#9002225 y http: // stackoverflow.com/questions/9025196/how-to-use-jpa-criteria-api-when-joining-many-tables/9025656#9025656 – perissf