API критериев гибернации с несколькими левыми внутренними соединениями

Отношения между таблицами следующие:

  • Таблица пользователей с идентификаторами столбцов, именем пользователя, возрастом
  • Таблица адресов со столбцами идентификатор, тип, улица
  • Таблица user_address_associations с идентификаторами столбцов, идентификатором пользователя и идентификатором адреса. userid имеет отношение внешнего ключа к users.identity, а addressid имеет отношение внешнего ключа к address.identity.

Я хотел бы выбрать всех пользователей старше 18 лет с типом адреса, установленным на 1. Сопоставления гибернации для объектов «Пользователь» и «Адрес» существуют, но в сопоставлении от пользователя к адресу не определены ассоциации. Единственная связь между пользователем и адресом указывается через таблицу user_address_associations. Кроме того, класс User не определяет свойство Addresses.

Необработанный SQL будет:

select * from users 
inner join user_address_associations   
on user_address_associations.userid=users.identity
inner join addresses 
on user_address_associations.addressid=addresses.identity and addresses.type=1
where db.users.age >= 18

Используя Hibernate 3.6.5 Criteria API, я начал с этого:

Criteria criteria = session.createCriteria(User.class);

// how to do the join to addresses table through user_address_associations table?

// where clause
criteria.add(Restrictions.gt("Age", 1176));

Вопрос в том, как мне сформулировать соединения?


person Klaus Nji    schedule 02.01.2013    source источник
comment
возможный дубликат Hibernate Criteria и множественного объединения   -  person mindas    schedule 02.01.2013
comment
@mindas, спасибо за ответ. Я только что прочитал ответ, который вы разместили в указанной ссылке, но все еще нуждаюсь в некоторой ясности с .createCriteria(b, join_between_a_b) и тем, как это преобразуется в соединение между классами A и B. Все еще пытаюсь понять документы API.   -  person Klaus Nji    schedule 02.01.2013
comment
как это преобразуется в соединение между классами A и B - если вы хотите увидеть фактически сгенерированный SQL, включите ведение журнала трассировки для org.hibernate.SQL. Если вы хотите понять, как Hibernate делает это внутри, вам нужно изучить исходный код Hibernate.   -  person mindas    schedule 02.01.2013


Ответы (1)


Это невозможно. Запросы Hibernate (HQL или Criteria) используют только сущности, их постоянные поля и их ассоциации. Если таблица соединений не сопоставлена ​​и не используется для определения ассоциации между объектами User и Address, вы не сможете определять запросы с использованием этой таблицы в Hibernate, кроме запросов SQL, конечно.

person JB Nizet    schedule 02.01.2013
comment
Спасибо. Будет рассмотрено изменение объектов для определения отношений. - person Klaus Nji; 03.01.2013