2

現在、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 がこれに対する答えになるとは思いません)。

サブコレクション クエリのサイズを制限する方法についてのアドバイスは、喜んで受け付けます。

ありがとうリッチ

4

1 に答える 1

0

ページネーションで使用する場合は、IN バッチ フェッチ タイプを使用する必要があります。

于 2012-06-25T14:09:26.873 に答える