Я тоже наткнулся на эту проблему.В конечном итоге я хотел бы выполнить следующий 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();
// ...
решил для меня функциональные требования.Это также должно дать вам достаточное представление о решении ваших конкретных функциональных требований.