В чем заключается ошибка составленного мной запроса? Нужно выбрать сертификаты, у которых есть связь со списком тегов (условие И).
Есть запрос:
Set<String> tagNames = ...
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<GiftCertificate> criteriaQuery = builder.createQuery(GiftCertificate.class);
Root<GiftCertificate> root = criteriaQuery.from(GiftCertificate.class);
Root<GiftCertificateToTagRelation> relationRoot = criteriaQuery.from(GiftCertificateToTagRelation.class);
Join<GiftCertificateToTagRelation, Tag> tagJoin = relationRoot.join(ParameterName.TAG);
Predicate condition = tagJoin.get(ParameterName.NAME).in(tagNames);
criteriaQuery.where(condition).groupBy(root);
В результате Hibernate формирует такой SQL запрос:
select *
from gift_certificate gc
cross join gift_certificate_to_tag_relation r
inner join tag t on r.tag_id = t.id
where t.name in (?, ?)
group by r.gift_certificate_id;
Но он неверный. Нужно в строке с "cross join" добавить "on r.gift_certificate_id = gc.id" и получится такое:
select *
from gift_certificate gc
cross join gift_certificate_to_tag_relation r on r.gift_certificate_id = gc.id
inner join tag t on r.tag_id = t.id
where t.name in (?, ?)
group by r.gift_certificate_id;
Тогда SQL запрос выполнится. Как с помощью Criteria Query добавить данное условие?