我有三个实体/表
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的方法。
答案 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"