在3个表上使用HQL中的左连接

时间:2012-09-18 05:28:44

标签: hql

我有三个表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)

请帮忙。

2 个答案:

答案 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