Как создать несколько внутренних соединений через отношения в QueryDSL - ссылаясь на промежуточные таблицы - PullRequest
0 голосов
/ 31 декабря 2018

У меня возникают проблемы при построении запросов, которые объединяют внутренние объединения в QueryDSL, где таблицы не находятся в

A --> B --> C 

отношениях, а скорее

A --> B <-- C

Вот мойSQL-запрос

select s.* from sales s
inner join branch b on b.id = s.branch_id
inner join manager m on m.branch_id = b.id and m.name = 'Alice';

(извлечен из моего примера здесь: https://www.db -fiddle.com / f / r5uvEsivyAhrP6KSpwJxBA / 1 )

Так что для моего QueryDSL-эквивалента яhave:

query.innerJoin(QSales.branch, QBranch)
     .innerJoin( ??? )

Я не могу понять, как создать следующее внутреннее соединение.

Все, что я пробовал, дает мне исключения, такие как Path expected for join!

Гипотетическиесли бы это было один-на-один, я бы просто зацепил вот так ...

query.innerJoin(QSales.branch, QBranch)
     .innerJoin( QBranch.manager, QManager ).on(QManager.name.eq('Alice'));

Но у меня такого отношения нет.

Я не могу найти подходящую конструкцию в QueryDSL для моделирования этого, но я предполагаю, что это будет возможно?

1 Ответ

0 голосов
/ 31 декабря 2018

Как правило, придумав несколько образцов, я нашел правильную комбинацию.

Это решение основано на отображении ManyToOne между B и многими Cs * 1008.*

query.innerJoin(QSales.branch, QBranch)
     .innerJoin( QBranch.managers, QManager )
       .on(QManager.name.eq('Alice'));

с managers, перечисленным в ветках, QueryDSL знает, что делать, и создает тот тип SQL, который мне подходит.

Я до сих пор не знаю, как решить это, менеджеры не отображаются.

...