Как получить все значения таблицы, отсортировав по количеству записей в связанной таблице через спецификации?

Есть две таблицы, эмейлы и рассылки. Связанные один ко многим. В представлении джавы у эмейла есть поле Collection<Рассылки>. Через Specification мне нужно получить все эмейлы у которых количество рассылок не больше какого то числа, которое приходит в метод. То есть мне нужно сначала посчитать сколько рассылок у каждого эмейла, сравнить, а после вывести нужные.

private static Specification<Email> isCountSendLessThan(Long count){
        return (root, query, criteriaBuilder) -> criteriaBuilder.lessThanOrEqualTo(criteriaBuilder.count(root.get("mailing")),count);
    }

Пытаюсь сделать так, но у меня не выходит


Ответы (1 шт):

Автор решения: Без опасности

Решение:

return (root, query, criteriaBuilder) -> {
            Subquery<Long> sq = query.subquery(Long.class);
            Root<Email> sqr = sq.from(Email.class);
            Predicate sqIdEq = criteriaBuilder.equal(sqr.get("id"), root.get("id"));
            Join<Object, Object> mailingRoot = sqr.join("mailing");
            sq.select(criteriaBuilder.count(mailingRoot)).where(sqIdEq);
            return criteriaBuilder.lessThanOrEqualTo(sq, count);
        };
→ Ссылка