@n199a
Java

В чем ошибка запроса Criteria Query?

6197c578be8f6498868495.png

В чем заключается ошибка составленного мной запроса? Нужно выбрать сертификаты, у которых есть связь со списком тегов (условие И).

Есть запрос:
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 добавить данное условие?
  • Вопрос задан
  • 60 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы