我有三个表A B和C.现在我想在HQL中执行这个sql查询:
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;
在编写等效的HQL时需要帮助。我试过这个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");
此查询抛出异常.....
org.hibernate.hql.ast.QuerySyntaxError:意外令牌:LEFT附近 第1行,第23栏[FROM com.admin.A作为LEFT JOIN B作为b其中 a.Id = b.Id LEFT JOIN C as c其中b.type = c.type] at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:74) 在 org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:214) 在 org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:127) 在 org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:83) 在 org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:414)
我还尝试使用“with”和“on”子句而不是where ...我在“on”或“with”上获得相同的意外标记
例外qith ON .....
org.hibernate.hql.ast.QuerySyntaxError:意外令牌:ON近线 1,第41列[FROM com.admin.A作为LEFT JOIN B作为b on a.Id = b.Id LEFT JO C作为c onb.type = c.type] at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:74) 在 org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:214) 在 org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:127) 在 org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:83) 在 org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:414)
我也尝试使用“with”子句而不是在哪里......我得到了相同的意外标记或“with”
异常qith WITH .....
org.hibernate.hql.ast.QuerySyntaxError:意外令牌:ON近线 1,第41列[FROM com.admin.A作为LEFT JOIN B作为b on a.Id = b.Id LEFT JO C作为c onb.type = c.type] at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:74) 在 org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:214) 在 org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:127) 在 org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:83) 在 org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:414)
请帮忙。
答案 0 :(得分:17)
我想您已经在配置中定义了所有需要的关联。如果是这样,在HQL中它看起来像这样:
from A as a left join a.B as b left join b.C as c
HQL中没有“ON”语句,hibernate会根据您的映射和定义的关联自动执行。
注意 a.B 和 b.C 。
您根据已定义的别名a& amp;来指代B和C.角
答案 1 :(得分:7)
使用此查询
from A as a
left join fetch a.B as b
left join fetch b.C as c