Връзките в таблицата са както следва:
- Таблица с потребители с колони идентичност, потребителско име, възраст
- Таблица с адреси с колони идентичност, тип, улица
- Таблица user_address_associations с колони identity, userid и addressid. userid има връзка с външен ключ към users.identity и addressid има връзка с външен ключ ip към addresses.identity.
Бих искал да избера всички потребители на възраст над 18 години с тип адрес, зададен на 1. Съпоставяния на хибернация за потребителски и адресни обекти съществуват, но няма асоциации, дефинирани в картографирането от потребител към адрес. Единствената връзка между потребител и адрес е посочена чрез таблицата user_address_associations. Освен това потребителският клас не дефинира свойство 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));
Въпросът е как да формулирам съединенията?