1

PetOwner という名前のエンティティがあります。PetOwner にはペットのリストがあります。各ペットにはストアがあります (つまり、このペットが生まれたストア)。Pet は抽象クラスであり、具体的なバージョンを取得すると多くの結合が行われます ( @Inheritance(strategy = InheritanceType.JOINED))。このシグネチャを持つ PetOwner のメソッドが必要です。

Set<Store> getAllStores();

問題は、ペットのリストの読み込みが非常に遅く、実際にはストアのリストを取得する必要がないことです。を呼び出すとgetAllStores、次のように SQL を実行したいと思います。

SELECT DISTINCT store_id
FROM pet
WHERE petowner_id = x;

しかし、次のように実装すると:

Set<Stores> stores = //
for (pet : pets)
   stores.add(pet.getStore());
return stores;

すべてのペットを引き込み、非常に遅くなります。では、どうすればすべてのペットを引き込むのを防ぐことができますか? 理想的には、PetOwner オブジェクトにこのメソッドが必要です。なぜなら、コードはそのようにオブジェクト指向になっていると思うからです。

また、PetOwner 内には他のメソッドがあり、低速ではありますが、ペットのリストをロードする必要があります。しかし、常に呼び出すとは限りません。そのため、このメソッドだけでペット リストの読み込みを回避したいと考えています。

4

2 に答える 2

1

PetOwners を取得するために使用するサービスがあるとします。メソッドを PetOwner に追加するのではなく、サービスに新しいメソッドを作成することをお勧めします。

public Set<Stores> getStoresForOwner( PetOwner owner );

そして、データ アクセス レイヤーに使用しているもの (hibernate テンプレート、Spring-data-jpa リポジトリ、EntityManager を直接) を使用して、名前付きクエリで呼び出しを行います。

@NamedQuery(name="PetOwnerStore.findAll", query="SELECT distinct p.Store from Pet p where p.Owner.id = :petOwnerId");

Pet から選択しているので、JPA はおそらくすべての結合を行わなければならないと主張することができます...

上記のすべては (とりわけ、エンティティ マッピングを指定していないため)、Pet と Store の間の関係が遅延フェッチであり、したがってまだ入力されていないことを前提としています。

于 2013-02-07T23:34:08.980 に答える
1

このデータをマッピングしていないため、これを行う標準的な方法はありません。私が見るさまざまなオプションは

  1. EM で名前付きクエリを直接使用するには
  2. ENntityManager を受け取り、クエリを直接実行するメソッドを PetOwner に追加するか、または
  3. 一時的なリストをペットの所有者に追加し、クエリを実行するポストロード イベントに入力します。ただし、PetOwner がリロードされない限り、これは更新を表示できません。
于 2013-02-08T12:29:16.107 に答える