13

我有三个表 AB 和 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:意外令牌:第 1 行附近的 LEFT,第 23 列 [从 com.admin.A 作为 LEFT JOIN B 作为 b where a.Id=b.Id LEFT JOIN C as c where b. type=c.type] 在 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:意外令牌:在第 1 行,第 41 列附近打开 [FROM com.admin.A 作为 LEFT JOIN B 作为 b on a.Id=b.Id LEFT JOIN C 作为 c onb.type =c.type] 在 org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:214) 在 org.hibernate.hql 的 org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:74)。 ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:127) 在 org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:83) 在 org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:414)

我还尝试使用“with”子句而不是 where...我在“with”或“with”上得到了相同的意外标记

例外 qith WITH .....

org.hibernate.hql.ast.QuerySyntaxError:意外令牌:在第 1 行,第 41 列附近打开 [FROM com.admin.A 作为 LEFT JOIN B 作为 b on a.Id=b.Id LEFT JOIN C 作为 c onb.type =c.type] 在 org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:214) 在 org.hibernate.hql 的 org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:74)。 ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:127) 在 org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:83) 在 org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:414)

请帮忙。

4

2 回答 2

21

我想您已经在配置中定义了所有需要的关联。如果是这样,在 HQL 中它看起来像这样:

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

HQL 中没有“ON”语句,hibernate 会根据您的映射和定义的关联自动执行。

注意aBbC

您根据已定义的别名 a 和 c 引用 B 和 C。

于 2012-10-01T07:26:44.580 回答
8

使用此查询

from A as a
left join fetch a.B as b 
left join fetch b.C as c 
于 2014-02-24T06:04:48.137 回答