2010-04-07 16 views
6

Sto avendo difficoltà a capire come rappresentare la seguente query JPQL:Esempio utilizzando CountDistinct in un'interrogazione JPA Criteri API

SELECT count(e) FROM Foo e 

utilizzando criteri API. Quello che sto cercando è:

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

ma questo non sta funzionando. Ho anche provato:

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

Questo è per JPA2, Eclipselink.

risposta

11

provare questo, questo sta lavorando 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. Io nuovo è stato un semplice errore. – Tim

5

Questa è una domanda piuttosto vecchio, ma per completezza ecco una semplice aggiunta:

Il titolo ha detto qualcosa di "usando CountDistinct" , così CountDistinct va ricordato qui:

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

Questo è importante se non si vuole contare le righe che sono il doppio. Se si vuole evitare le righe doule nel risultante, si sarebbe dovuto usare:

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