Критерии запроса гибернации для объединения трех таблиц

У меня есть запрос sql:

select * from A
INNER JOIN B
ON A.id = B.id
INNER JOIN C
ON B.id = C.id
INNER JOIN D
ON C.id = D.id
where D.name = 'XYZ'
   and D.Sex = 'M'

Я пытался использовать критерии запроса гибернации для указанного выше sql, но у меня возникли проблемы. Может ли кто-нибудь помочь.


person user1502377    schedule 04.07.2012    source источник
comment
что вы хотите в результате? А экземпляры?   -  person Francisco Spaeth    schedule 04.07.2012
comment
Спит, да ... мне нужны экземпляры из A   -  person user1502377    schedule 04.07.2012
comment
Hibernate - это все о сопоставлении ИЛИ. Никто не знает, как выглядят ваши объекты, просто взглянув на ваш SQL. Это может быть так же просто, как из A, где a.b.c.d.name = 'XYZ' и a.b.c.d.sex = 'M', или невыполнимо, если у вас нет правильных отношений.   -  person Adrian Shum    schedule 05.07.2012


Ответы (2)


По вашему вопросу вы хотите выполнить декартово соединение, и это не поддерживается критериями, хотя вы можете сделать это с помощью HQL, как показано ниже. Аналогичный вопрос есть здесь

С помощью HQL-запроса вы можете сделать что-то вроде:

select a from 
   A a, 
   B b, 
   C c 
where 
   a.id = b.id and 
   c.id = b.id and 
   d.id = c.id and 
   d.name = 'XYZ' and 
   d.sex = 'M'

Запрос используется в обычном запросе гибернации:

Query query = session.createQuery(query); // <-- here you use the query above
List results = query.list();
person Francisco Spaeth    schedule 04.07.2012
comment
Для этого мне нужно использовать критерии запроса спящего режима. Например, c = session.createCriteria (Dokument.class, dokument); c.createAlias ​​(документ.роль, роль); // внутреннее соединение по умолчанию c.createAlias ​​(role.contact, contact); c.add (Restrictions.eq (contact.lastName, Test)); вернуть c.list (); - person user1502377; 04.07.2012

person    schedule
comment
Когда мы говорим session.createAlias ​​(a.b, b) ... создаст ли это внутреннее соединение между A и B? - person user1502377; 05.07.2012
comment
И насколько отличается от - person user1502377; 05.07.2012
comment
Это не было бы иначе, однако исходный вызов createCriteria дал псевдоним: createCriteria (A.class, a). В результате и при дальнейших ссылках на поля из экземпляра A необходимо использовать расширение a. префикс. - person Matt; 05.07.2012
comment
На самом деле, я не думаю, что они должны, но, по крайней мере, они могут. Я считаю более понятным присвоить псевдоним каждой сущности, даже корневой. И да, как указывает javadoc, он создает внутреннее соединение. - person JB Nizet; 05.07.2012