25

ルート エンティティをロードし、すべての子コレクションと集約メンバーを積極的にロードしたいと考えています。

SetFetchModeFluentNHibernate でを使用しようとしましたが、3 レベルの深さがあるため、子コレクションの 1 つで重複が発生しています。DistinctRootEntityResultTransformer残念ながら、ルートの重複を削除するだけです。

return Session.CreateInvoiceBaseCriteria(query, archived)
    .AddOrder(new Order(query.Order, query.OrderType == OrderType.ASC))
    .SetFetchMode("States", FetchMode.Eager)
    .SetFetchMode("Attestations", FetchMode.Eager)
    .SetFetchMode("AttestationRequests", FetchMode.Eager)
    .SetFetchMode("AttestationRequests.Reminders", FetchMode.Eager)
    .SetResultTransformer(new DistinctRootEntityResultTransformer())
    .List<Invoice>();

これをアーカイブするためにマルチクエリまたは同様のものを使用できますか?

さらに、このアプローチでは、データベースからの結果セットが不必要に膨大になるのではないでしょうか?

助言がありますか?

4

3 に答える 3

8

解決策を見つけましたが、きれいではありません。最初にすべての請求書 ID を見つけてから、それらをマルチクエリで使用し、最後に HashedSet を介して結果をフィルタリングします。アイテムの数が多いため、通常の Restriction.In を使用できず、文字列として送信する必要がありました。

提案された調整はありますか?

var criteria = Session.CreateInvoiceBaseCriteria(query, archived)
    .SetProjection(Projections.Id());

var invoiceIds = criteria.List<int>();
if (invoiceIds.Count > 0)
{
    var joinedIds = JoinIDs(criteria.List<int>()); // To many ids to send them as parameters.

    var sql1 = string.Format("from Invoice i inner join fetch i.States where i.InvoiceID in ({0}) order by i.{1} {2}", joinedIds, query.Order, query.OrderType.ToString());
    var sql2 = string.Format("from Invoice i inner join fetch i.AttestationRequests where i.InvoiceID in ({0})", joinedIds);
    var sql3 = string.Format("from Invoice i inner join fetch i.Attestations where i.InvoiceID in ({0})", joinedIds);

    var invoiceQuery = Session.CreateMultiQuery()
        .Add(sql1)
        .Add(sql2)
        .Add(sql3);

    var result = invoiceQuery.List()[0];

    return new UniqueFilter<Invoice>((ICollection)result);
}

return new List<Invoice>();
于 2009-06-04T23:00:33.023 に答える
2

あなたの質問に答えるために:はい、それは巨大な結果セットをもたらします。

私は次のことを提案します:

  • 熱心にフェッチすることなく、単純にクエリを記述します
  • 特定の場所では、熱心なフェッチを配置しますが、クエリごとに1つだけです
  • インデックスを使用したり、クエリやマッピング戦略を強化したりすることで解決できないパフォーマンスの問題が実際に発生する場合は、複数のクエリでソリューションを使用してください。
于 2009-10-21T08:57:37.183 に答える
0

それはあなたが探しているものと正確には一致しないかもしれませんが、私はこの記事を見ることをお勧めします:

多くの子コレクションを含む積極的な読み込みアグリゲート

そのサイトの残りの部分を見ると、熱心な読み込みやその他の素晴らしいnHibernateに関する投稿がさらにたくさん見つかります。

于 2009-06-02T08:39:19.337 に答える