2

EclipsLink JPA を使用してエンティティに対してクエリを作成したい状況があります。このエンティティには多くのフィールドが 5 つ必要です。これらのフィールドのうち 2 つは、結合された OneToMany 関係です。各結合から 2 つのプリミティブ フィールドのみが必要です。

これを行う最も効率的な方法は何ですか?

いくつかの可能性を検討しましたが、読んだ内容に基づいてバッチ読み取りが最善の策のようですが、これは完全なエンティティを取得する場合、つまり FROM エンティティを選択する場合にのみ機能すると思います...そしてそうしない理由これを行いたいのは、危険なほどメモリを消費する LOB および BLOB 型があるためです。

Join-fetch は別ですが、エンティティには 10 個までの結合テーブルがあり、このデータをすべて複製したくありません。

私はフェッチ グループ ( http://wiki.eclipse.org/EclipseLink/Examples/JPA/AttributeGroup ) を使用し、必要なフィールドを指定して、キャッシュされた遅延読み込みを引き起こします。これは実行可能であり、メモリ フットプリントが改善されます。問題は、entity.getCollection() を実行すると、呼び出しごとに 1 つの SQL ステートメントを実行する必要があり、これが非効率的だと感じるところです。何らかの形式のバッチ処理または結合フェッチを使用してエンティティ A から SELECT a.Field, a.Field2 を実行できた場合、またはこれをフェッチ グループに適用した方がよい場合、これが最善だと思いますが、確実に実行できるかどうかはわかりません。関連するすべてのテーブルをロードせず、必要なものだけを提供してください。

ヘルプ/考えをいただければ幸いです。

4

1 に答える 1

1

ネストされたフェッチグループでもバッチフェッチが機能すると思いますが、これを試しましたか?

また、FetchGroupManager に defaultFetchGroup を設定することもできます (直接、またはフェッチ グループに含めたくないフィールドに fetch=LAZY を追加することで、つまり、LOB フィールドに fetch=LAZY を追加します)。

于 2013-06-04T14:28:34.893 に答える