Имеется 2 таблицы-сущности и третья таблица (gift_certificate_to_tag_relation) для связи многие-ко-многим:
Необходимо получить список
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