API за критерии за хибернация с множество леви вътрешни съединения

Връзките в таблицата са както следва:

  • Таблица с потребители с колони идентичност, потребителско име, възраст
  • Таблица с адреси с колони идентичност, тип, улица
  • Таблица 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));

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


person Klaus Nji    schedule 02.01.2013    source източник
comment
възможен дубликат на Hibernate Criteria и multiple join   -  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)


Това е невъзможно. Заявките за хибернация (HQL или критерии) използват само обекти, техните постоянни полета и техните асоциации. Ако таблицата за присъединяване не е картографирана и не се използва за дефиниране на асоциация между обектите User и Address, няма да можете да дефинирате заявки, използвайки тази таблица с Hibernate, освен SQL заявки, разбира се.

person JB Nizet    schedule 02.01.2013
comment
Благодаря ти. Ще разгледа модифицирането на обекти, за да дефинира връзки. - person Klaus Nji; 03.01.2013