1

JPA を使用しており、オブジェクトのコレクションがクエリから返されると、外部キーを介して関連付けられた「子」オブジェクトごとに個別のクエリが実行されます。

たとえば、Authorization エンティティ クラスでは、次の Client オブジェクトがマップされています。

@JoinColumn(name = "clientId", referencedColumnName = "clientId")
@ManyToOne (fetch = FetchType.LAZY)
@NotNull(groups = Default.class)
private Client client;

10 個の承認が返されると、10 個のクライアント クエリが実行されます。TopLink では、ReadAllQuery クラスの addBatchReadAttribute() メソッドを使用して、この数を 1 にすることができました。TopLinkのドキュメントによると、「バッチ化されたパーツのいずれかにアクセスすると、パーツはすべて単一のクエリで読み取られます。これにより、パーツに必要なすべてのデータを(n)クエリではなく単一のクエリで読み取ることができます."

これは完全に機能し、10 個の ID を持つ IN 句を使用した単一のクエリが得られました。

私が re について読んだこと: JPA は、バッチ結合または次のようなものに向けて私を指摘しました:

hints = {@QueryHint(name = "eclipselink.batch", value = "p.client"), ... 

この戦略は、クエリの数を減らすのに役立ちます。

  • しかし、それはまた、より多くの結合をもたらし、おそらくいくつかのクエリで速度が低下しました (?)
  • そして、TopLink の呼び出しほど大幅には効果がないように思われました。

WHERE 句に IN を含む単一のクエリを使用する戦略を取得する方法はありますか?

前もって感謝します。デイブ

4

2 に答える 2

1

TopLinkは、いくつかのタイプのバッチ・フェッチをサポートしています。

http://java-persistence-performance.blogspot.com/2010/08/batch-fetching-optimizing-object-graph.htmlを参照してください。

于 2011-09-28T14:17:41.957 に答える
1

内部的に、QueryHint "eclipselink.batch" は addBatchAttribute() に変換されるため、表示される動作は同じになります。作成したJPQLは、ネイティブTopLink APIと同じ問合せを生成しますか? JPQLにFetchまたは追加の結合がある可能性はありますか?

于 2011-09-28T13:05:39.643 に答える