jpql 等同于以下 SQL 查询:
select * from App left outer join App_Child on (App.id=App_Child.id and App_Child.status = 'active') where App.status='active' and App.id=1;
示例数据:
ij> select * from App;
ID |STATUS
----------------------
1 |active
2 |active1
3 |active3
5 |active
4 rows selected
ij> select * from App_Child;
ID |STATUS |D
----------------------------------
1 |active |1
2 |active11 |2
1 |active111 |3
1 |active |4
4 rows selected
ij> select * from App left outer join App_Child on (App.id=App_Child.id and App_Child.status = 'active') where App.status='active' and App.id=1;
ID |STATUS |ID |STATUS |D
---------------------------------------------------------
1 |active |1 |active |1
1 |active |1 |active |4
2 rows selected
ij> select * from App left outer join App_Child on (App.id=App_Child.id and App_Child.status = 'active') where App.status='active' and App.id=5;
ID |STATUS |ID |STATUS |D
---------------------------------------------------------
5 |active |NULL |NULL |NULL
1 row selected
编辑:我们正在使用 jpa 2.0
答案 0 :(得分:3)
由于App.id=App_Child.id
关系,会自动添加条件@ManyToOne
。在JPA 2.1中,您可以使用显式on
子句添加其他条件:
select a
from App a left outer join
a.children c on (c.status = 'active')
where a.status='active' and a.id=1;
答案 1 :(得分:0)
如果您希望SQL查询找到具有“活动”App_Child的所有应用程序,您可以尝试使用而不是加入。
-- Alternative SQL to join
select a.* from App a where a.ID = 1 and exists (select * from App_Child b where a.id=b.id AND b.STATUS = 'active')
在你的例子中,你有两件事情在继续。在此页面上的SQL示例中,您只是从App表中获取列。虽然你从App表中获取了列,但是只显示了“活动”子行的App_Child。这个存在方法适用于您只想要检索应用程序的第一个查询,但如果您想要同时获取应用程序和子项,那么它将无济于事。
您可以做的是向应用程序添加一个方法,以获取Active App_Child的集合并映射适当的属性。您可以使用此“存在”查询获取所需的应用程序,然后在每个应用程序上调用getActiveChildren。
我在你的小提琴上测试了SQL,这里是编辑:http://sqlfiddle.com/#!4/0f39a/6/2
此参考显示您存在于JPQL中。 http://openjpa.apache.org/builds/1.2.0/apache-openjpa-1.2.0/docs/manual/jpa_langref.html#jpa_langref_exists
希望你有足够的信息来试试。