我有三个实体/表
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"