HQL左加入条件是指第三实体

  • 本文关键字:实体 条件 HQL left-join hql
  • 更新时间 :
  • 英文 :


我有三个实体/表

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

我想让所有的A和左加入具有特定C值的B

例如

我想要A和B的C.值='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的方法,因为左联接条件中有子查询。

阅读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

如果您遇到以下错误:子句引用了两个不同于子句的元素,请阅读此问题。

这个问题没有以有助于清晰思考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"

最新更新