2012-07-04 2 views
1

У меня есть SQL-запрос:Hibernate критерии запроса для соединения между 3 таблицы

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, но возникают проблемы. Может кто-нибудь помочь.

+0

что вы хотите, как результат? экземпляры A? –

+0

Говорите, да .. Мне нужны экземпляры от A – user1502377

+2

Hibernate - это все, что касается отображения OR. Никто не знает, как выглядят ваши объекты, просто взглянув на ваш SQL. Это может быть так же просто, как «от A, где a.b.c.d.name =« XYZ »и a.b.c.d.sex =« M », или невозможно, если у вас нет правильных отношений. –

ответ

1

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

С 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(); 
+1

Для этого я должен использовать критерии запроса hibernate. Для ex-Criteria c = session.createCriteria (Dokument.class, «dokument»); c.createAlias ​​("dokument.role", "role"); // внутреннее соединение по умолчанию c.createAlias ​​(«role.contact», «contact»); c.add (Restrictions.eq ("contact.lastName", "Test")); return c.list(); – user1502377

5
Criteria c = session.createCriteria(A.class, "a"); 
        .createAlias("a.b", "b") 
        .createAlias("b.c", "c") 
        .createAlias("c.d", "d") 
        .add(Restrictions.eq("d.sex", "M")) 
        .add(Restrictions.eq("d.name", "XYZ")); 
+0

Когда мы говорим, что session.createAlias ​​(«a.b», b) .. создаст ли он внутреннее соединение между A и B? – user1502377

+0

И как отличается критерий.createAlias ​​(«ab», «b») - это просто сказать критерии. CreateAlias ​​(«b», «b») – user1502377

+0

Это было бы иначе, однако, внутренний вызов createCriteria дал псевдоним: createCriteria (A.class, "a"). В результате и дальнейшая ссылка на поля из экземпляра A должна использовать «a». префикс. – Matt