問題タブ [fetching-strategy]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
nhibernate - ファサードレイヤーを介してNHibernate Linqフェッチ戦略を設定する方法
データ アクセスに NHibernate を使用していますが、ファサード レイヤーを介してアクセスしています。このレイヤーは、リポジトリのインターフェイスと、ISession オブジェクトに対応する IUnitOfWork インターフェイスで構成されます。
取得されたエンティティが正しく管理されるように、リポジトリにはコンストラクタで IUnitOfWork が渡され、ロードには IUnitOfWork が使用されます。
IUnitOfWork には All というプロパティが含まれており、クラスのすべてのエンティティを IQueryable として取得します (後でフィルタリングするため)。したがって、今年作成されたすべてのエンティティを取得するリポジトリ メソッドは、次のようになります。
注意: これは、これらのインターフェイスとクラスの完全なコードではありません! 私の質問に関連するコードのみ。
IUnitOfWork インターフェイス:
UnitOfWork 具象クラス:
IFooRepository インターフェイス
FooRepository 具象クラス
関連するエンティティを熱心にロードできるように、フェッチ戦略を指定する機能を追加したいと考えています。Foo に別のエンティティ Bar に対応するプロパティがあるとします。
マッピング ファイルでは Bar が遅延読み込みされるように指定されていますが、ThisYearsFoos リポジトリ プロパティで、N+1 選択を回避するために Bar を積極的に読み込むように指定したいと思います。
Linq to NHibernate では、Expand() 拡張メソッドを使用して熱心なフェッチを指定できます。ただし、この拡張メソッドは NHibernateQueryable 型に属していますが、IUnitOfWork インターフェイスの GetList メソッドは IQueryable についてしか認識していません。
明らかに、IUnitOfWork インターフェイスが INHibernateQueryable について認識したくないのは、それが NHibernate について認識していないことが想定されているためです。
上記で指定したデザインを使用して、これを行う方法はありますか? それとも、私のデザインを再考する必要がありますか?
ありがとう
デビッド
java - Hibernateのバッチフェッチアルゴリズムはどのように機能しますか?
バッチフェッチアルゴリズムのこの説明は、「Manning-Java PersistencewithHibernate」で見つかりました。
実際のバッチフェッチアルゴリズムとは何ですか?(...)バッチサイズが20で、バッチでロードする必要がある初期化されていないプロキシの総数が119であると想像してください。起動時に、Hibernateはマッピングメタデータを読み取り、11個のバッチローダーを内部で作成します。各ローダーは、初期化できるプロキシの数を知っています:20、10、9、8、7、6、5、4、3、2、1。目標は、ローダー作成のためのメモリ消費を最小限に抑え、可能なバッチフェッチを生成できます。もう1つの目標は、明らかにSQLSELECTの数を最小限に抑えることです。119個のプロキシを初期化するために、Hibernateは7つのバッチを実行します(6 x 20> 119であるため、おそらく6つを期待していました)。適用されるバッチローダーは、Hibernateによって自動的に選択される5回20、1回10、および1回9です。
しかし、私はまだそれがどのように機能するのか理解していません。
- なぜ11個のバッチローダー?
- バッチローダーが初期化できる理由:20、10、9、8、7、6、5、4、3、2、1プロキシ?
誰かが段階的なアルゴリズムを提示できるなら...:)
nhibernate - Nhibernate - ページングと熱心な読み込みエンティティ
チームと従業員の 2 つのエンティティがあります。
熱心なチームを持つ従業員のリストを取得したい。リストはページングする必要があります。
なぜこれが機能しないのですか?
SQL の結果:
java - 追加のSQLステートメントを発行するHIbernate fetch join
2 つの ManyToOne 参照を持つ次の Parent クラスを考えてみましょう。
次の hql クエリを使用して、親インスタンスをロードしています。
これにより、常に hibernate が別個の SQL ステートメントを発行して、子インスタンス 1 行をロードし、フェッチ結合を実行することになります。
余分な sql ステートメントを回避するための助けをいただければ幸いです。
.net - SetFetchMode 呼び出しは無視されました
次のクエリで Criteria API の SetFetchMode 呼び出しに問題があります。
私のクラス:
そしてマッピング
しかし、ユーザー リストを取得した後、Nhibernate はデータベースに再度クエリを実行して、各ユーザーの企業コレクションを再度取得します。NHibernate は SetFetchMode の呼び出しを無視するだけです。これは、次のような記述を試みたためです。
Nhibernate は例外をスローしません。
また、マッピングで Lazy を false に設定しようとしましたが、これも役に立ちませんでした。それを修正する方法がわかりません、誰かできますか
その後、Nhibernate はエンティティを含むコレクションをロードしました。しかし、彼はまだ SetFetchMode を無視しています。私はそこに何でも書き込むことができます。
entity-framework - Entity Framework PreserveChanges をデフォルトの MergeOption に設定
ASP.net mvc 2 プロジェクトで、すべてのエンティティ タイプに対してデフォルトの MergeOption を PreserveChanges に設定する方法はありますか?
現在、すべてのエンティティ タイプの mergeOption を設定する大規模なサブがあります。
ありがとう
c# - Linq to NHibernate ThenFetch 複数のプロパティ
私はこのオブジェクトグラフを持っています:
今、私は s のリストを返すクエリを作成しており、A
すべてのB
s、C
s、X
s、およびY
s が必要です。また、それらを B でグループ化してルックアップします。
注意すべき点がいくつかあります。
- これは、すべてのデータを返す必要があるレポートです。無制限の結果は問題ではありません。
- すべての実際の値が必要な場合、使用はより複雑に見える
ToLookup
ため、使用してグループ化を行っています。グループについてデータベースにクエリを実行し、次にそれらの実際の値についてクエリを実行する必要があります。group by
私の質問は、フェッチ戦略を適切に指定する方法です。私が行った方法は、これを実行するために見つけた唯一の方法です(すべてのbxとby値をフェッチしました)-しかし、間違っているように見えるSQLを生成します:
ご覧のとおり、値をa.b
3 回取得b1
しています。b3
フェッチとb6
where 句です。
- これは DB のパフォーマンスに悪影響を与えると思いますが、正しいでしょうか?
.Fetch
一度だけ取得するように呼び出しを変更する方法はありa.b
ますか?- これは私の問題に対する良いアプローチですか?
grails - Grails の自動リレーショナル フェッチ
GORM/Grailsで自動リレーションフェッチを行うことは可能ですか?
次に、この関係を次のように使用します。
java - DatabaseMetaData クエリから結果セットのフェッチ モードを変更できますか?
DatabaseMetaData インスタンスを使用してデータベースを検査しています。DB 内のテーブルのすべての情報を取得し、すべての結果セットを問題なく反復処理します。
繰り返しの最後に、ResultSet の先頭に戻りたいので、beforeFirst() メソッドを呼び出し、次に next() メソッドを呼び出して、ResultSet の最初の要素を取得します。これが私のコードです:
すべての結果を取得しましたが、次の例外があります。
「ここまではすべて正常に見えます。私の接続 (MSAcsess への JDBC-OBDC) によると、私の ResultSet のフェッチ モードは ONLY_FORWARD であるため、次を使用して変更しようとしました。
予約モードを許可するために...しかし、それは私を許可しません。新しい例外:
フェッチ モードを DatabaseMetaData からの結果セットに設定することは可能ですか? どうすればできますか??
ありがとう。
entity-framework-4.1 - Entity Framework 4.1 および NHibernate のフェッチ戦略のカプセル化
NHibernate 3+ と Entity Framework 4.1 をテストするプロジェクトを作成し、リポジトリにラップして、インターフェイスなどを使用して非常にテストしやすくしました。
どちらの ORM もリポジトリの外部に公開したくありません (IQueryables も公開しません)。すべてはそのレイヤーで処理する必要があり、フェッチを抽象的な方法で処理しようとするまでは、すべてがうまくいきました。
積極的な読み込みを追加する Microsoft の実装では、Include 関数でマジック ストリング (yuck) または Linq 式 (yay) を使用します。それらの構文は次のようになります。
1 つ目は、関連する人物をロードするだけです。(親) 2 番目は、関連する会社と各会社の連絡先を読み込みます。(親と祖父母)。3 つ目は、関連するすべての注文、項目、および各注文の費用を読み込みます。
これはかなり洗練された実装です。
Hibernate は少し異なるアプローチを使用します。彼らはまだLinq式を使用していますが、拡張メソッドをより頻繁に使用しています(流暢なアプローチ)。
(3 行目の構文が正しいかどうかはわかりません)
式のリストを別のクラスにカプセル化し、それらの式をそのクラス内の IQueryable に適用できます。したがって、Microsoft 式の構文を標準化し、式ツリーをたどって各式を再構築することで、それを NHibernate の構文に変換する必要があります。
これは本当にトリッキーな部分です。IQueryable の正しい関数を呼び出すために、特定の操作順序を維持する必要があります (Fetch または FetchMany のいずれかで開始し、その後はそれぞれ「ThenFetch」または「ThenFetchMany」にする必要があります)。 ExpressionVisitor クラスで。
編集:最終的に、プロパティ、コレクション、およびコレクションの選択の任意のレベルのネストを取り、式の配列を生成する式パーサーを作成しました。残念ながら、組み込みの Fetch 拡張メソッドは LambdaExpression をパラメーターとして取りません。
私が現在立ち往生している部分は、nHibernate からの組み込みの Fetch 定義を使用できないことです。Remotion ライブラリの関数を直接叩くか、パーサーを満たす独自の拡張メソッドを登録する必要があるようです。
ファンキー。