QueryDSL для фильтрации объединенных сущностей SpringData - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь использовать 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
)

Структура БД: enter image description here

Участник может быть членом 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 для фильтрации связанных сущностей?Или есть какие-нибудь хорошие альтернативные технологии для построения запросов?

1 Ответ

0 голосов
/ 16 мая 2018

Изменение части запроса andAnyOf на

.andAnyOf(memberEntity.hackathonEntity.id.eq(hackathonId), 
    projectEntity.hackathonEntity.id.eq(hackathonId)));

должно дать вам только одно левое соединение и никаких перекрестных объединений в Hibernate.

РЕДАКТИРОВАТЬ: если это по-прежнему не выполняетсяработать для вас, я бы порекомендовал отредактировать ваш вопрос, включив в него описание ваших сущностей.

...