HQL左连接,条件引用第三个实体

时间:2014-09-01 16:02:40

标签: left-join hql

我有三个实体/表

A与B具有一对多的关系,B与C具有一对一的关系。

我希望获得所有A和左边的B联接,具有特定的C值

e.g。

我希望A与B有C.value ='A'

表A

  id

   1

   2

   3

表B

idToA ║ idToC ║ value

    1 ║     1 ║   'X'

    2 ║     1 ║   'Y'

    3 ║     2 ║   'Z'

表C

  id ║  value

   1 ║    'A'

   2 ║    'B'

   3 ║    'C'

并且结果为

A.id ║ b.value

   1 ║     'X'

   2 ║     'Y'

   3 ║     

我设法获得以下SQL:

select a.id, b.value 
from A left outer join B on A.id = B.idToA and B.idToC in 
  (select id from C where C.value = 'A')

但由于左连接条件中的子查询,我似乎无法找到将此查询转换为HQL的方法。

2 个答案:

答案 0 :(得分:0)

阅读JPA2.0规范后,左连接定义为:

LEFT [OUTER] JOIN join_association_path_expression [AS] identification_variable
[join_condition]

这意味着您可以将SQL转换为JPQL(我希望您的Hibernate至少为4.3):

select a.id, b.value 
from A a
left join a.idToA b on b.idToC in  (select id from C where C.value = 'A') // or property pointing to C

如果遇到此错误: with-clause引用了两个不同的from-clause元素,请阅读此question

答案 1 :(得分:0)

这个问题不是以有助于清晰思考JPA或Hibernate的方式提出的。该语言不应该是关于外键,例如a.idToB。相反,您的引用应该更像

class A {
   @OneToMany()
   private List<B> bList;

   ... etc
}

class B {
    @ManyToOne()
    private A a;

    @OneToMany()
    private List<C> cList;

    ... etc ... 
}

您的查询中未指定密钥。它们由您的类映射,以便您的JPA实现可以管理连接。那么您的示例查询可能看起来更像是

"select a.id, b.value from A a 
    left join a.bList b
    left join b.cList c
    where c.value = :valueParam
    or b is null"