Как мне создать HQL-запрос для возврата объектов в отношениях «многие ко многим»? - PullRequest
0 голосов
/ 21 марта 2010

У меня есть приложение, которое включает в себя 2 класса Club и Article. Они отображаются в Hibernate как отношения многие ко многим.

В результате hibernate создал таблицу с именем CLUB_ARTICLE, которую он использует для управления отношением «многие ко многим». Таблицы CLUB и ARTILCE не имеют прямой ссылки друг на друга, и отображение представлено только в таблице CLUB_ARTICLE.

Мне нужно создать HQL-запрос, который возвращает список статей для конкретного клуба. Поэтому мне нужно предоставить идентификатор клуба и получить список объектов Article, которые ему принадлежат. По какой-то причине я просто не могу понять, как это сделать. Любая помощь будет очень ценной!

Спасибо.

Ответы [ 3 ]

1 голос
/ 21 марта 2010

Какая связь между Club и Article в коде ? Вам нужно забыть о схеме базы данных, когда вы думаете, ваш HQL. В hql могут использоваться только отношения, определенные в отображении спящего режима (аннотация или xml).

Предполагая, что ваше отображение двунаправленное, и у вас есть коллекция Club, называемая клубами в Article, вы можете сделать что-то вроде:

String hql = "from Article where clubs = :club";

Затем задайте свой клубный объект в запросе:

Query q = sess.createQuery(hql);
q.setEntity("club", club);

Теперь, если в Article нет коллекции (списка / набора) Club, все становится сложнее. Вы можете выбрать из Клуба и сделать прогноз на идентификаторы статей, а затем получить их. Однако я бы предложил, чтобы вы просто добавили свойство коллекции к сущности Article, поскольку это не повлияет на схему базы данных и облегчит запросы.

0 голосов
/ 21 марта 2010

Вы должны думать об объекте и отношении между объектами, а не таблицами, при написании вашего HQL. Здесь, чтобы получить список Article для конкретного Club по его идентификатору, вы можете сделать что-то вроде этого:

select club.articles from Club c where c.id =:id
0 голосов
/ 21 марта 2010
from Article a join a.clubs c where c.id=:clubid
...