0

ここに私が持っているものがあります:

Entity A -> oneToMany -> Entity B -> manyToOne -> Entity C

また、A と別のエンティティ X の間で外部キーを使用せずに内部結合を行う必要があるため、createQuery ではなく createSqlQuery を使用する必要があります。(明らかに、データベースを変更することはできません)

だから、私ができたのは、素敵な 2N+1 選択だけです。(fetch=EAGER を使用しても、手動でも同じです)。

誰かが何か考えがありますか?

編集: @BatchSize を使用して、選択の数を A から B に減らしました。現在、N+2 の選択があります。

編集 2: データベースが古い DB2 であり、クラッシュするため、内部結合 (コンマを使用) を使用できません。

4

3 に答える 3

1

N+1 を回避するには、マップ フィールドで次のコードを使用できます。

@Fetch(FetchMode.JOIN)

これが役立つことを願っています。

于 2011-03-10T09:36:23.853 に答える
0

漠然とした回答で申し訳ありませんが、私はこれを実際に経験したことがありません。ResultTransformers を使用してこの問題にアプローチしようとします。

http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/transform/ResultTransformer.html

残念ながら、これに関するドキュメントはほとんどないため、テスト スイートを見て、その使用方法を確認するのが最善の方法です。

于 2011-03-09T16:18:03.713 に答える
0

次のようなものを使用できますが、複雑なクエリでどのように機能するかはわかりません。

s.createSQLQuery(
    "SELECT {a.*}, {b.*}, {c.*} " +
    "FROM X x JOIN A a ON ... JOIN B b ON ... JOIN C c ON ...")
    .addEntity(A.class, "a")
    .addJoin(B.class, "a.b")
    .addJoin(C.class, "a.b.c")

以下も参照してください。

于 2011-03-09T15:53:29.000 に答える