5

このデータの SQL フィドル リンク

次のSQLクエリに相当するjpqlは何ですか:

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が自動的に追加され@ManyToOneます。onまた、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

「アクティブな」 App_Child を持つすべてのアプリを SQL クエリで検索する場合は、結合する代わりに存在を試すことができます。

-- 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')

あなたの例では、2つのことが起こっていました。このページの SQL の例では、App テーブルから列を取得しているだけです。ただし、「アクティブな」子行のみが表示された App_Child だけでなく、 App テーブルからも列を取得しています。この exists メソッドは、アプリを取得するだけの最初のクエリでは機能しますが、アプリと子の両方を一緒にフェッチする場合は役に立ちません。

ただし、App エンティティにメソッドを追加して、アクティブな 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 に答える