Estoy implementando el tipo de funcionalidad de "búsqueda avanzada" para una entidad en mi sistema de forma que el usuario pueda buscar esa entidad usando múltiples condiciones (eq, ne, gt, lt, etc.) en los atributos de esta entidad. Estoy utilizando la API Criteria de JPA para generar dinámicamente la consulta Criteria y luego usando setFirstResult()
& setMaxResults()
para admitir la paginación. Todo estaba bien hasta este punto, pero ahora quiero mostrar el número total de resultados en la grilla de resultados, pero no veo una manera directa de obtener el conteo total de la consulta de Criteria.
Así es como mi código es el siguiente:Recuento total de filas para paginación usando criterios JPA API
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Brand> cQuery = builder.createQuery(Brand.class);
Root<Brand> from = cQuery.from(Brand.class);
CriteriaQuery<Brand> select = cQuery.select(from);
.
.
//Created many predicates and added to **Predicate[] pArray**
.
.
select.where(pArray);
// Added orderBy clause
TypedQuery typedQuery = em.createQuery(select);
typedQuery.setFirstResult(startIndex);
typedQuery.setMaxResults(pageSize);
List resultList = typedQuery.getResultList();
Mi conjunto de resultados podría ser grande por lo que no quiero cargar mis entidades para la consulta de recuento, así que dime manera eficaz de obtener el recuento total como método de rowCount()
Criteria (creo que está ahí en los Criterios de Hibernate).
¿Pudo averiguar por qué exactamente necesita agregar 'em.createQuery (cq);'? Gracias – Ittai
Oye, esto es justo lo que necesitaba ... ¡pero también me gustaría saber por qué es necesaria esta línea! –
Sospecho que tiene que ver con el hecho de que los 'Predicados' se están construyendo usando' Root <> 'de esta parte' Root from = cQuery.from (Brand.class); 'y luego se usan para ambos la consulta de recuento y la consulta paginada. AFAIK necesita construir los predicados dos veces usando ambos objetos 'Root <>'. El segundo está oculto en esta línea 'cq.select (builder.count (cq.from (Brand.class)));'. Por qué exactamente 'em.createQuery (cq);' funciona, no sé, IMO debería arrojar una excepción. –
Neilos