Критерии гибернации Присоединяйтесь к 3 таблицам - PullRequest
57 голосов
/ 04 января 2012

Я ищу критерии гибернации, чтобы получить следующее:

Dokument.class отображается на роль * 1003 Идентификатор роли *

Role.class имеет контактного лица ContactId

Contact.class Имя LastName

Я хочу найти имя или фамилию в классе Contact и получить список подключенных документов.

Я пробовал что-то вроде этого:

session.createCriteria(Dokument.class)
.setFetchMode("role",FetchMode.JOIN)
.setFetchMode("contact",FetchMode.JOIN)
.add(Restrictions.eq("LastName","Test")).list();

Я получаю сообщение об ошибке: не удалось разрешить свойство «LastName» для класса «Документ»

Может кто-нибудь объяснить, почему объединение выполняет поиск в Документе, а не во всех объединенных таблицах? Заранее спасибо за помощь!

1 Ответ

113 голосов
/ 04 января 2012

Режим выборки только говорит о том, что ассоциация должна быть выбрана. Если вы хотите добавить ограничения на связанный объект, вы должны создать псевдоним или подкритерий. Я обычно предпочитаю использовать псевдонимы, но YMMV:

Criteria c = session.createCriteria(Dokument.class, "dokument");
c.createAlias("dokument.role", "role"); // inner join by default
c.createAlias("role.contact", "contact");
c.add(Restrictions.eq("contact.lastName", "Test"));
return c.list();

Это, конечно, хорошо объяснено в справочном руководстве Hibernate , а в javadoc for Criteria даже есть примеры. Прочитайте документацию: в ней много полезной информации.

...