Отношения между таблицами следующие:
- Таблица пользователей с идентификаторами столбцов, именем пользователя, возрастом
- Таблица адресов со столбцами идентификатор, тип, улица
- Таблица 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));
Вопрос в том, как мне сформулировать соединения?