9

選択を使用して積極的にコレクションを取得しようとしていますが、取得しているのは内部結合だけです。何が起こっている?

Session.CreateCriteria(typeof(Foo))
    .SetFetchMode("Bars", FetchMode.Select)
    .CreateAlias("Bars", "b")
    .SetFetchMode("b.Bazes", FetchMode.Select)
    .List();

FetchMode を Eager に変更しようとしましたが、うまくいきません。個別の選択ではなく、内部結合がまだ取得されています。内部結合の原因となる FetchMode についてドキュメントには何も記載されていないため、内部結合がどこから取得されているのかさえわかりません。熱心な選択を取得することは可能ですか?

更新 OKエイリアスを作成すると内部結合が発生することがわかりました。したがって、.CreateAlias("Bars", "b", JoinType.None) を使用できますが、b.Bazes のフェッチは遅延読み込みに戻ります。うーん。

4

3 に答える 3

1

INNER JOIN は、NHibernate がレコードとそれに関連する子レコードをロードする方法です。一般的に、これが最も効率的な方法です。

複数の SELECT ステートメントを使用する場合は、子のクエリに何らかの方法で親の条件を含める必要があります。INNER JOIN を使用すると、関連する子だけを簡単に取得できます。NHibernate は、クエリの実行後にこれを複数のエンティティに正しく分割します。

Entity Framework 4 では、複数のクエリを実行し、関連するオブジェクトを「魔法のように」再接続できると思いますが、NHibernate にそのような機能があることは知りません (私が間違っていれば、誰かが私を修正してくれると確信しています)。 .

于 2009-12-15T04:39:07.737 に答える
1

nhibernate から Eager ロード エンティティには、左外部結合が使用されます。したがって、次のようにコードを変更する必要があります。

Session.CreateCriteria(typeof(Foo))
.SetFetchMode("Bars", FetchMode.Select)
.CreateAlias("Bars", "b", JoinType.LeftOuterJoin)
.SetFetchMode("b.Bazes", FetchMode.Select)
.List();

同様のシナリオで私を助けました。

于 2010-11-05T06:40:18.967 に答える
0
Session.CreateCriteria(typeof(Foo))
   .SetFetchMode("Bars", FetchMode.Select)
   .CreateAlias("Bars", "b")  <-- this line triggers a join ( think )
   .SetFetchMode("b.Bazes", FetchMode.Select) 
   .List();

結合が本当に必要ない場合は、マッピングで fetch="select" を指定できますが、推奨されない N+1 の選択が発生します (各 Foo エンティティに対して 1 つの選択、次に各 Baze に対して 1 つの選択)。

于 2009-12-15T07:36:07.270 に答える