views:

946

answers:

2

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

http://java.sun.com/javaee/6/docs/api/javax/persistence/criteria/CriteriaQuery.html

http://java.sun.com/javaee/6/docs/tutorial/doc/gjivm.html

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?

+1  A: 
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
cq.select(cb.count(cq.from(MyEntity.class)));

return em.createQuery(cq).getSingleResult();
axtavt
+1  A: 

A query of type MyEntity is going to return, MyEntity! You want a query for a Long, no?

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.

Affe
That's what I had figured myself, thanks. But that means I can't use the same query instance to query for for the number of results and the actual results which I know is analogous to SQL, but which would make this API a lot more OOP-like. Well, at least I can reuse some of the predicates, I guess.
seanizer