Извлечение родительского элемента по атрибуту удаленной связанной коллекции в HQL? - PullRequest
0 голосов
/ 21 октября 2011

Доброе утро всем. Мне нужна помощь с запросом. Можно предположить, что я понимаю относительно сложные запросы SQL, но эта новомодная вещь HQL меня немного смущает.

У меня есть 5 объектов, от A до E. Я собираюсь использовать строчные буквы (от a до e) для ссылки на атрибуты в этих объектах, которые указывают на объект того же типа в верхнем регистре.

В моей структуре классов A имеет ссылку на B. B имеет ссылку на C. C имеет коллекцию (от одного до многих) из D. И D имеет ссылку на E.

       />D->E
A->B->C->D->E
       \>D->E
        ...

В базе данных D - это таблица отношений, в которой хранятся внешние ключи как C, так и E (коллекция отображается обратным атрибутом D.c).

Мне нужен список всех, поскольку чья отдаленно связанная коллекция D содержит D, относящуюся к конкретному E. Я сделал этот псевдопросмотр (что-то похожее будет работать в MySQL), чтобы проиллюстрировать проблему:

select A
from D
left join E on D.e = E
left join C on D.c = C
left join B on B.c = C
left join A on A.b = B
where E = myfilter

Однако это не работает, потому что, очевидно, в HQL нет 'on'. Я пробовал варианты с синтаксисами, которые я нашел в руководствах, но hibernate всегда выдает какую-то непонятную ошибку или другую (невозможно разыменовать коллекцию, недопустимый токен, атрибут не отображается - хотя он и т. Д.) Основная проблема заключается в том, что Мне не нужно фильтровать по наличию фактического элемента коллекции (D), но атрибут одного (E).

Кто-нибудь знает, как помочь? Если вам нужны разъяснения, оставьте комментарий.

Ответы [ 2 ]

0 голосов
/ 21 октября 2011

Нет необходимости в on в HQL, потому что HQL используется для обхода ассоциаций сущностей, и Hibernate уже знает, как сопоставления отображаются в базе данных.Таким образом, он вставляет предложение on в сгенерированный SQL для вас.Вы должны думать с точки зрения сущностей и их ассоциаций, а не с точки зрения таблиц.Таким образом, ваш запрос должен быть просто

select a from A a
inner join a.b b
inner join b.c c
inner join c.listOfDs d
inner join d.e e
where e.someProperty = :someValue

, так как e должно быть не нулевым, чтобы выполнить условие, нет смысла использовать левые соединения.внутренние соединения обычно более производительны.

0 голосов
/ 21 октября 2011

Вам нужно что-то вроде следующего (не проверено)

Select a
From A as a
Left outer join A.b as B
Left outer join B.c as C
Left outer join c.DList as D // DList is the name of the property that is a list of D
Left outer join D.e as E
Where e == filter
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...