ホームページ > データベース > mysql チュートリアル > Eager Fetching を使用した NHibernate QueryOver が複数の SQL クエリを生成するのはなぜですか?

Eager Fetching を使用した NHibernate QueryOver が複数の SQL クエリを生成するのはなぜですか?

Susan Sarandon
リリース: 2025-01-05 16:13:45
オリジナル
542 人が閲覧しました

Why Does NHibernate QueryOver with Eager Fetching Generate Multiple SQL Queries?

NHibernate QueryOver でフェッチすると複数の SQL クエリが発生する

クエリの問題:

使用時QueryOver で積極的な読み込みを使用して関連リストをフェッチすると、複数のデータベース ヒットが発生し、多数のエラーが発生します。

例:

Session.QueryOver<UserRole>()
       .Fetch(x => x.UsersInRole).Eager
       .List();
ログイン後にコピー

説明:

この動作は、多くの SQL クエリの性質によるものです。 -対多の関係。このマッピング例では、UserRole エンティティは UsersInRole エンティティと多対多の関係を持っています。積極的な読み込みが使用される場合、NHibernate は、取得された UserRole エンティティごとに、関連するすべての UsersInRole エンティティをロードしようとします。

ただし、セッションにはまだすべての関連エンティティが含まれていない可能性があるため、これらの関係を取得するために複数の SQL クエリが発行されます。最初のクエリは UserRole エンティティを取得し、後続のクエリは各 UserRole に対して発行されて、関連する UsersInRole エンティティを取得します。

解決策:

SQL クエリを最小限に抑えるための 1 つの効果的なソリューションバッチフェッチを使用することです。 HasManyToMany マッピングで BatchSize プロパティを設定すると、NHibernate は単一の SQL クエリで複数の関連エンティティをフェッチできます。

HasManyToMany(x => x.UsersInRole)
...
.BatchSize(25)  
ログイン後にコピー

バッチ サイズを適切な値 (例: 25) に設定すると、NHibernate はSQL クエリの数を制限し、データベースの総ヒット数を減らし、パフォーマンスを向上させます。

さらに、クラスのバッチ サイズを設定します。マップは、全体的な取得戦略の最適化にも役立ちます。

以上がEager Fetching を使用した NHibernate QueryOver が複数の SQL クエリを生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート