2012-09-18 5 views
9

Mam trzy tabele B i C. Teraz chcę wykonać to zapytanie SQL w HQL:Korzystanie Lewy Łączy w HQL na 3 tablicach

select * from A as a 
left join 
B as b 
on 
a.id = b.id 
left join 
C as c 
on 
b.type=c.type; 

Potrzebujesz pomocy w pisaniu równoważne HQL. Próbowałem z tym HQL ...

Query q = session.createQuery(
    "FROM A as a 
    LEFT JOIN 
    B as b 
    on 
    a.id=b.id 
    LEFT JOIN 
    C as c 
    on 
    b.type=c.type"); 

To zapytanie jest rzucanie wyjątku .....

org.hibernate.hql.ast.QuerySyntaxError: unexpected token: LEFT near line 1, column 23 [FROM com.admin.A as a LEFT JOIN B as b where a.Id=b.Id LEFT JOIN C as c where b.type=c.type] at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:74) at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:214) at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:127) at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:83) at org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:414)

Próbowałem też z "z" i "na" klauzul zamiast gdzie ... mam ten sam nieoczekiwany znak na "on" lub "z"

wyjątkiem qith oN .....

org.hibernate.hql.ast.QuerySyntaxError: unexpected token: ON near line 1, column 41 [FROM com.admin.A as a LEFT JOIN B as b on a.Id=b.Id LEFT JOIN C as c onb.type=c.type] at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:74) at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:214) at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:127) at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:83) at org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:414)

próbowałem też z "z" klauzuli s zamiast gdzie ... mam takie same Nieoczekiwany token lub "z"

wyjątkiem qith z .....

org.hibernate.hql.ast.QuerySyntaxError: unexpected token: ON near line 1, column 41 [FROM com.admin.A as a LEFT JOIN B as b on a.Id=b.Id LEFT JOIN C as c onb.type=c.type] at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:74) at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:214) at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:127) at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:83) at org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:414)

Proszę o pomoc.

Odpowiedz

15

Przypuszczam, że już zdefiniowałeś wszystkie potrzebne skojarzenia w swojej konfiguracji. Jeśli tak, to w HQL to będzie wyglądać następująco:

from A as a left join a.B as b left join b.C as c 

Nie ma „ON” oświadczenie w HQL, Hibernacja jest automatycznie w oparciu o przekształceniach i określonych skojarzeń.

Zwróć uwagę na a.B i b.C.

Odwołujesz się do B i C na podstawie już zdefiniowanych aliasów a & c.

+0

ty rakietowymi upvoted ty – kakabali

+0

jak chcemy zapisać dane do listy w tej sprawie? – kakabali

+0

To powinna być zaakceptowana odpowiedź :) – tusar

7

Użyj tego zapytania

from A as a 
left join fetch a.B as b 
left join fetch b.C as c 
+0

kołysałeś przegłosował cię – kakabali