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 を含む単一のクエリを使用する戦略を取得する方法はありますか?
前もって感謝します。デイブ