Я пытаюсь использовать QueryDSL в своем сервисе Spring Data для реализации запроса, аналогичного SQL
SELECT member.*
FROM member
LEFT JOIN project on member.projectid = project.id
WHERE
member.role = 'EXPERT' AND (
project.hackathonid = :hackathonId OR
member.hackathonid = :hackathonId
)
Структура БД:
Участник может быть членом Project или Hackathon.Проект является частью хакатона.Я пытаюсь найти всех членов Hachaton и дочерних проектов.
Интерфейс QueryDslPredicateExecutor не работает для меня, потому что Predicate создает перекрестное соединение:
memberEntity.role.eq(roleSelector).andAnyOf(
memberEntity.hackathonEntity.id.eq(hackathonId),
memberEntity.projectEntity.hackathonEntity.id.eq(hackathonId)
)
Я пытался использоватьJPAQuery, чтобы иметь возможность вручную управлять стратегией JOIN, но также столкнулся с той же проблемой:
query.from(memberEntity)
.leftJoin(projectEntity).on(memberEntity.projectEntity.id.eq(projectEntity.id))
.where(
memberEntity.role.eq(roleSelector).andAnyOf(
memberEntity.hackathonEntity.id.eq(hackathonId),
memberEntity.projectEntity.hackathonEntity.id.eq(hackathonId)
)
)
Hibernate: выберите memberenti0_.id в качестве id1_10_, memberenti0_.hackathonid в качестве hackatho4_10_, memberenti0_.userid в качестве userid5_ti0_elend_ell_ele_de_d_d_set__de__de__de__e_e_e_e_e_e_t_1_1_1_1_1_1projectid в качестве projecti6_10_, memberenti0_.publishstatus в качестве publishs2_10_, memberenti0_.role в качестве role3_10_ из public.member memberenti0_ оставленное внешнее объединение public.project projectent1_ на (memberenti0_.projectid_projeid и memberenti0_.role =?и (memberenti0_.hackathonid =? или projectent2_.hackathonid =?)
Как правильно использовать QueryDSL для фильтрации связанных сущностей?Или есть какие-нибудь хорошие альтернативные технологии для построения запросов?