Гибернация «многие ко многим»: критерии поиска всех классов A, которые содержат класс B - PullRequest
8 голосов
/ 27 октября 2010

У меня есть 2 класса, которые имеют отношения многие ко многим.Я использую «Вопрос» и «Тег» в качестве примера, чтобы сделать случай более понятным.

Для каждого вопроса у вас есть несколько тегов.То же самое, что и для тега.

Я хотел бы получить все вопросы (и соответствующие им теги), если в вопросе содержится тег "hibernate".сделать это с помощью SQLQuery в таблице «многие ко многим» и вернуть список с идентификатором вопроса.Затем используйте критерий с ограничениями и соберите все вопросы.Но это слишком неуклюже, и я уверен, что есть лучший способ сделать это, не так ли?

1 Ответ

23 голосов
/ 27 октября 2010

По сути, вам нужно создать псевдоним и использовать псевдоним для запроса дочерней коллекции следующим образом:

List questions = sess.createCriteria(Question.class)
    .createAlias("Tags", "t")
    .add( Restrictions.eq("t.name", "hibernate") )
    .list();

Я предполагаю, что на самом деле у вас нет класса, который представляет таблицу "bridge" для таблицы тегов в этом сценарии, в противном случае вам потребуется создать 2 псевдонима, например:

List questions = sess.createCriteria(Question.class)
        .createAlias("QuestionTag", "qt")            
        .createAlias("qt.Tags", "t")
        .add( Restrictions.eq("t.name", "hibernate") )
        .list();

Вы можете узнать больше из документов:

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/querycriteria.html#querycriteria-associations

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...