2010-04-07 17 views
6

estoy teniendo problemas para encontrar la manera de representar la siguiente consulta JPQL:usando CountDistinct en una consulta JPA los criterios del API

SELECT count(e) FROM Foo e 

utilizando los criterios del API. Lo que estoy intentando es:

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Foo> c = cb.createQuery(Foo.class); 
Root<Foo> f = c.from(Foo.class); 
c.select(cb.count(f)); 

pero esto no está funcionando. También probé:

c.select(cb.count(f.get("id")); 

Esto es para JPA2, Eclipselink.

Respuesta

11

probar esto, este es el trabajo con Hibernate 3.5.1:

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<Long> c = cb.createQuery(Long.class); 
Root<Foo> f = c.from(Foo.class); 
c.select(cb.count(f)); 
int count = em.createQuery(c).getSingleResult().intValue(); 
+0

Arghhh. Yo nuevo, fue un simple error. – Tim

5

Ésta es una pregunta bastante viejo, pero por completitud aquí es una simple adición:

El título dice algo sobre "el uso de CountDistinct" , por lo CountDistinct debe mencionarse aquí:

CriteriaBuilder critBuilder = entityManager.getCriteriaBuilder(); 
CriteriaQuery<Long> critQuery = criteriaBuilder.createQuery(Long.class); 
Root<Foo> root = critQuery.from(Foo.class); 

critQuery.select(critBuilder.countDistinct(root)); 
int count = entityManager.createQuery(critQuery).getSingleResult().intValue(); 

Esto es importante si no desea contar filas que son el doble. Si se quiere evitar filas doule en su resultList, que había tenido que utilizar:

CriteriaBuilder critBuilder = entityManager.getCriteriaBuilder(); 
CriteriaQuery<Long> critQuery = criteriaBuilder.createQuery(Long.class); 
Root<Foo> root = critQuery.from(Foo.class); 

critQuery.select(root).distinct(true); 
List<Foo> result = entityManager.createQuery(critQuery).getResultList(); 
Cuestiones relacionadas