Как подсчитать количество строк, возвращаемых подзапросом? - PullRequest
13 голосов
/ 24 марта 2011

Я хочу сделать что-то вроде этого:

select count(*) from (select ...)

(как это было бы в SQL), но в JPA.

Любые идеи о том, как я бы это сделал?

Ответы [ 2 ]

24 голосов
/ 22 августа 2012

Я тоже наткнулся на эту проблему.В конечном итоге я хотел бы выполнить следующий JPQL:

SELECT COUNT(u)
FROM (
   SELECT DISTINCT u
   FROM User u
   JOIN u.roles r
   WHERE r.id IN (1)
)

Но это было невозможно, также не с критериями API.Исследования показали, что это всего лишь ограничение дизайна в JPA.В спецификации JPA говорится, что подзапросы поддерживаются только в предложениях WHERE и HAVING (и, следовательно, не в FROM).

Переписывание запроса в следующей форме JPQL:

SELECT COUNT(u)
FROM User u
WHERE u IN (
   SELECT DISTINCT u
   FROM User u
   JOIN u.roles r
   WHERE r.id IN (1)
)

с использованием API JPA Criteria следующим образом:

CriteriaQuery<Long> query = cb.createQuery(Long.class);
Root<User> u = query.from(User.class);
Subquery<User> subquery = query.subquery(User.class);
Root<User> u_ = subquery.from(User.class);
subquery.select(u_).distinct(true).where(u_.join("roles").get("id").in(Arrays.asList(1L)));
query.select(cb.count(u)).where(cb.in(u).value(subquery));
Long count = entityManager.createQuery(query).getSingleResult();
// ...

решил для меня функциональные требования.Это также должно дать вам достаточное представление о решении ваших конкретных функциональных требований.

10 голосов
/ 26 марта 2011

Это должно сработать (если вы хотите использовать API критериев JPA):

CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();  
CriteriaQuery<Long> query = cb.createQuery(Long.class);

Root<Entity> root = query.from(Entity.class);

//Selecting the count
query.select(cb.count(root));

//Create your search criteria
Criteria criteria = ...

//Adding search criteria   
query.where(criteria);

Long count = getEntityManager().createQuery(query).getSingleResult();

С другой стороны, если вы хотите использовать JP-QL, следующий код должен сработать:

//Add the where condition to the end of the query
Query query = getEntityManager().createQuery("select count(*) from Entity entity where...")
Long count = query.getSingleResult();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...