Ejemplo de uso de countDistinct en un JPA API de Criterios de consulta

Estoy teniendo problemas para averiguar cómo se representan las siguientes JPQL consulta:

SELECT count(e) FROM Foo e

utilizando los Criterios de la API. Lo que estoy tratando 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 traté de:

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

Esto es para JPA2, Eclipselink.

OriginalEl autor Tim | 2010-04-07

2 Kommentare

  1. 11

    probar este, este es trabajar 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();
    Arghhh. Supe que se trataba de un simple error.

    OriginalEl autor Buchi

  2. 5

    Esta es una muy vieja pregunta pero para completura he aquí una simple adición:

    El título decía algo sobre «el uso de countDistinct», por lo que countDistinct debe ser mencionado 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 usted no desea contar las filas que se doble.
    Si usted quiere evitar doule filas en su ResultList, hubiera tenido que usar:

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

    OriginalEl autor AlexS

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea