Soy bastante nuevo en JPA 2 y es CriteriaBuilder / CriteriaQuery API:
CriteriaQuery
en el tutorial de Java EE 6
Me gustaría contar los resultados de una CriteriaQuery sin recuperarlos realmente. Si es posible, no encontré ningún método de este tipo, la única forma sería hacer esto:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<MyEntity> cq = cb
.createQuery(MyEntityclass);
// initialize predicates here
return entityManager.createQuery(cq).getResultList().size();
Y esa no puede ser la forma correcta de hacerlo ...
¿Existe una solución?
java
jpa-2.0
criteriaquery
Sean Patrick Floyd
fuente
fuente
Respuestas:
MyEntity
Volverá una consulta de tipoMyEntity
. Quieres una consulta para unLong
.Obviamente, querrá construir su expresión con las restricciones y agrupaciones, etc., que omitió en el ejemplo.
fuente
qb.count
se realiza sobre elRoot<MyEntity>
de su consulta (Root<MyEntity>
myEntity = cq.from (MyEntity.class)) y esto a menudo ya está en su código de selección normal y cuando lo olvida, termina con una unión a sí mismo.He resuelto esto usando cb.createQuery () (sin el parámetro de tipo de resultado):
Espero eso ayude :)
fuente
fuente
Como otras respuestas son correctas, pero demasiado simples, para que sea más completo, presento el siguiente fragmento de código para realizar
SELECT COUNT
en una consulta sofisticada de criterios JPA (con múltiples combinaciones, recuperaciones, condiciones).Se modifica ligeramente esta respuesta .
Espero que le ahorre tiempo a alguien.
Porque en mi humilde opinión, la API de criterios JPA no es intuitiva ni del todo legible.
fuente
recursion on databases
? Estaba hablando de recursividad a nivel de API. No confunda estos conceptos :-) JPA viene con una API muy poderosa / compleja que le permite hacer múltiples combinaciones / recuperaciones / agregaciones / alias, etc. en una sola consulta. Tienes que lidiar con eso mientras cuentas.Es un poco complicado, dependiendo de la implementación de JPA 2 que use, esta funciona para EclipseLink 2.4.1, pero no para Hibernate, aquí un recuento genérico de CriteriaQuery para EclipseLink:
El otro día migré de EclipseLink a Hibernate y tuve que cambiar mi función de conteo a la siguiente, así que siéntete libre de usarlo ya que este es un problema difícil de resolver, puede que no funcione para tu caso, ha estado en uso desde Hibernate 4.x, observe que no trato de adivinar cuál es la raíz, sino que la paso de la consulta para resolver el problema, demasiados casos de esquina ambiguos para intentar adivinar:
fuente
También puede utilizar Proyecciones:
fuente
Con Spring Data Jpa, podemos usar este método:
fuente