5

此数据的 SQL FIDDLE 链接

什么是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

4

2 回答 2

6

由于关系,条件App.id=App_Child.id会自动添加@ManyToOneon在 JPA 2.1 中,您可以使用显式子句添加附加条件:

select a 
from App a left outer join 
     a.children c on (c.status = 'active') 
where a.status='active' and a.id=1;

参见例如EclipseLink 文档

于 2012-11-05T11:43:46.670 回答
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 中获取列,但仅显示“活动”子行,但在您的小提琴中。此 exists 方法适用于您只想检索应用程序的第一个查询,但如果您想同时获取应用程序和子项,则它无济于事。

不过,您可以做的是向 App 实体添加一个方法,以获取 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

希望这些信息足以让您尝试一下。

于 2012-12-04T10:42:15.153 回答