javajpa-2.0criteriaquery

In JPA 2, using a CriteriaQuery, how to count results


I am rather new to JPA 2 and it's CriteriaBuilder / CriteriaQuery API:

CriteriaQuery javadoc

CriteriaQuery in the Java EE 6 tutorial

I would like to count the results of a CriteriaQuery without actually retrieving them. Is that possible, I did not find any such method, the only way would be to do this:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();

CriteriaQuery<MyEntity> cq = cb
        .createQuery(MyEntityclass);

// initialize predicates here

return entityManager.createQuery(cq).getResultList().size();

And that can't be the proper way to do it...

Is there a solution?


Solution

  • A query of type MyEntity is going to return MyEntity. You want a query for a Long.

    CriteriaBuilder qb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Long> cq = qb.createQuery(Long.class);
    cq.select(qb.count(cq.from(MyEntity.class)));
    cq.where(/*your stuff*/);
    return entityManager.createQuery(cq).getSingleResult();
    

    Obviously you will want to build up your expression with whatever restrictions and groupings etc you skipped in the example.