現在、JPA (Eclipse リンク) バッチ クエリを使用して、データベースからオブジェクトを読み取っています。各オブジェクトには複数のサブコレクションがあり、JPA にも反映されます。
私はバッチクエリが提供するパフォーマンスのためにバッチクエリを使用していますが、欠点があります (おそらく回避可能であるため、私の質問です)。
次のオブジェクト定義が与えられます (無実を保護するために名前が変更されていますが、構造は同じままです)。
@Entity
@Table(name = "TBL_ITEMX")
class ItemX
{
@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "ID_NO", referencedColumnName = "ID_NO")
@BatchFetch(value = BatchFetchType.JOIN)
private Collection<SubItem1> subItem1;
@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "ID_NO", referencedColumnName = "ID_NO")
@BatchFetch(value = BatchFetchType.JOIN)
private Collection<SubItem2> subItem2;
@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "ID_NO", referencedColumnName = "ID_NO")
@BatchFetch(value = BatchFetchType.JOIN)
private Collection<SubItem3> subItem3;
... getters/setters
}
たとえば、 setFirstResult と setMaxResult でクエリ範囲を制限した場合
String qs = "select p from ItemX p";
Query qb = em.createQuery(qs);
qb.setFirstResult(0);
qb.setMaxResults(100);
これは、データベース内の最初の 100 個の ItemX エントリのみが必要であることを示しています。各 ItemX には複数のコレクションがあることに注意してください。クエリは ItemX を 0 から 100 の間で制限します。ただし、EntityManager がコレクションを処理するとき、各コレクションのすべてのデータベース行を (クライアントの) メモリにロードします。
バッチ クエリが必要な各コレクションのアイテムのみをプルするように、この動作を制限する方法はありますか。または、結果のクエリをサーバーに残し、結果のスクロール可能なウィンドウを提供するようにデータベースに依頼しますか? (スクロール可能な結果を試しましたが、役に立ちませんでした)。
現時点ではクエリを処理できますが、コレクションとデータを追加すると、クエリが JVM を吹き飛ばします (64 ビット JVM がこれに対する答えになるとは思いません)。
サブコレクション クエリのサイズを制限する方法についてのアドバイスは、喜んで受け付けます。
ありがとうリッチ