@n199a
Java

Как составить запрос с JOIN в CriteriaQuery?

Имеется 2 таблицы-сущности и третья таблица (gift_certificate_to_tag_relation) для связи многие-ко-многим:
618a8077bede3230947735.png

Необходимо получить список tag по gift_certificate. Для этого дела составил SQL запрос:
SELECT tag.name FROM Tag tag JOIN gift_certificate_to_tag_relation relation on tag.id = relation.tag_id WHERE relation.gift_certificate_id = 13;


Переделав его для Hibernate сущностей он примет вид:
SELECT tag FROM Tag AS tag JOIN GiftCertificateToTagRelation AS relation ON relation.tag = tag WHERE relation.giftCertificate = :giftCertificate";


Теперь пытаюсь составить запрос с помощью CriteriaQuery:
CriteriaQuery<Tag> cq = cb.createQuery(Tag.class);
Root<Tag> rootTag = cq.from(Tag.class);

// JOIN GiftCertificateToTagRelation AS relation ON relation.tag = tag
Join<Tag, GiftCertificateToTagRelation> join = rootTag.join(ParameterName.GIFT_CERTIFICATE);

// WHERE relation.giftCertificate = :giftCertificate
Predicate condition = cb.equal(join.get(ParameterName.GIFT_CERTIFICATE), gc);

// Full SQL query: SELECT tag FROM Tag AS tag JOIN GiftCertificateToTagRelation AS relation ON relation.tag = tag WHERE relation.giftCertificate = :giftCertificate
cq.select(rootTag).where(condition);

return em.createQuery(cq)
                .getResultStream()
                .collect(Collectors.toSet());


Но получаю ошибку при выполнении:
Unable to locate Attribute  with the the given name [giftCertificate] on this ManagedType
  • Вопрос задан
  • 124 просмотра
Пригласить эксперта
Ваш ответ на вопрос

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

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