2010-04-07 5 views
6

Je vais avoir du mal à trouver comment représenter la requête JPQL suivante:Exemple d'utilisation CountDistinct dans une requête API JPA Critères

SELECT count(e) FROM Foo e 

en utilisant l'API de critères. Ce que j'essaie est:

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

mais cela ne fonctionne pas. J'ai également essayé:

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

Ceci est pour JPA2, Eclipselink.

Répondre

11

essayer, cela travaille avec mise en veille prolongée 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. Je nouveau c'était une simple erreur. – Tim

5

C'est une question assez vieux mais est ici une complétude plus simple:

Le titre dit quelque chose sur « en utilisant CountDistinct » , donc CountDistinct devrait être mentionné ici:

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(); 

Ceci est important si vous ne voulez pas compter les lignes qui sont doubles. Si vous voulez éviter les lignes doule dans votre de résultats, vous auriez dû utiliser:

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(); 
Questions connexes