3

他のエンティティのリストを含むエンティティがあります。たとえば、それは Address エンティティのリストを持つ Person である可能性があります。アドレスは 1 人に固有のものではありません。(実際にはDBの真ん中にある結合テーブルとの多対多の関係です)

ID X の住所を持っていないすべての人を検索しようとしています。

(これは、例の自明性のために意味をなさないかもしれません。私の現実の世界では、そうです:))

名前付きクエリは次のとおりです。

SELECT p FROM Person p left join fetch p.addresses a WHERE p.addresses IS EMPTY OR a.id != :addressId

addressId は、渡すアドレスの ID です

私の問題は、例で最もよく説明されています

  • 個人 1 は住所 1 と住所 2 を持っている可能性があります。
  • 個人 2 は住所 2 を持っている可能性があります
  • 個人 3 は住所 3 を持っている可能性があります

そして今、望ましい結果

  • アドレス 1 を渡すと、person2 と person 3 が返されます
  • アドレス 3 を渡すと、person1 と person 2 が返されます
  • 住所 2 を渡すと、人 3 が戻ってきてほしい

現在、アドレス 1 を渡すと、3 つすべてが返されます。これは、人 1 もアドレス 2 を持っているためだと思います。これは、クエリを通過することを意味します。

リスト内のIDを検索する方法を知っている人はいますか?それが要素のいずれかに存在する場合、それを返さないのですか?

これが理にかなっていることを願っています。そうでない場合は、詳細を提供してみてください

ありがとう

4

2 に答える 2

4

次のクエリを使用できます。

select p from Person p where not exists 
(select a from Person pe left join pe.addresses a where p = pe and a.id = ?1)
于 2012-08-24T13:20:40.600 に答える
1

ID を使用して実際のエンティティを取得することで、これを行う方法を見つけたと思います。次に、NOT MEMBER OF を使用できます

たとえば、これの代わりに

SELECT p FROM Person p left join fetch p.addresses a WHERE p.addresses IS EMPTY OR a.id != :addressId

そうです

entityManager.find(Address.class, addressId);
SELECT p FROM Person p WHERE :address NOT MEMBER OF p.addresses 

entityManger.find の追加呼び出しを行う必要がありますが、JPQL で明示的に結合する必要はありません。この余分な呼び出しのために、これがより非効率的であるかどうかはわかりません。少し異なるアプローチではありますが、問題は解決します。

私はまだIDだけを使ってそれができるかどうか見てみたいと思います...

于 2012-08-24T11:17:39.113 に答える