問題タブ [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.

0 投票する
2 に答える
1490 参照

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 について認識していないことが想定されているためです。

上記で指定したデザインを使用して、これを行う方法はありますか? それとも、私のデザインを再考する必要がありますか?

ありがとう

デビッド

0 投票する
2 に答える
2376 参照

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です。

しかし、私はまだそれがどのように機能するのか理解していません。

  1. なぜ11個のバッチローダー?
  2. バッチローダーが初期化できる理由:20、10、9、8、7、6、5、4、3、2、1プロキシ?

誰かが段階的なアルゴリズムを提示できるなら...:)

0 投票する
1 に答える
493 参照

nhibernate - Nhibernate - ページングと熱心な読み込みエンティティ

チームと従業員の 2 つのエンティティがあります。

熱心なチームを持つ従業員のリストを取得したい。リストはページングする必要があります。

なぜこれが機能しないのですか?

SQL の結果:

0 投票する
1 に答える
1502 参照

java - 追加のSQLステートメントを発行するHIbernate fetch join

2 つの ManyToOne 参照を持つ次の Parent クラスを考えてみましょう。

次の hql クエリを使用して、親インスタンスをロードしています。

これにより、常に hibernate が別個の SQL ステートメントを発行して、子インスタンス 1 行をロードし、フェッチ結合を実行することになります。

余分な sql ステートメントを回避するための助けをいただければ幸いです。

0 投票する
2 に答える
1426 参照

.net - SetFetchMode 呼び出しは無視されました

次のクエリで Criteria API の SetFetchMode 呼び出しに問題があります。

私のクラス:

そしてマッピング

しかし、ユーザー リストを取得した後、Nhibernate はデータベースに再度クエリを実行して、各ユーザーの企業コレクションを再度取得します。NHibernate は SetFetchMode の呼び出しを無視するだけです。これは、次のような記述を試みたためです。

Nhibernate は例外をスローしません。

また、マッピングで Lazy を false に設定しようとしましたが、これも役に立ちませんでした。それを修正する方法がわかりません、誰かできますか

その後、Nhibernate はエンティティを含むコレクションをロードしました。しかし、彼はまだ SetFetchMode を無視しています。私はそこに何でも書き込むことができます。

0 投票する
2 に答える
1394 参照

entity-framework - Entity Framework PreserveChanges をデフォルトの MergeOption に設定

ASP.net mvc 2 プロジェクトで、すべてのエンティティ タイプに対してデフォルトの MergeOption を PreserveChanges に設定する方法はありますか?

現在、すべてのエンティティ タイプの mergeOption を設定する大規模なサブがあります。

ありがとう

0 投票する
1 に答える
5358 参照

c# - Linq to NHibernate ThenFetch 複数のプロパティ

私はこのオブジェクトグラフを持っています:

今、私は s のリストを返すクエリを作成しており、AすべてのBs、Cs、Xs、およびYs が必要です。また、それらを B でグループ化してルックアップします。

注意すべき点がいくつかあります。

  1. これは、すべてのデータを返す必要があるレポートです。無制限の結果は問題ではありません。
  2. すべての実際の値が必要な場合、使用はより複雑に見えるToLookupため、使用してグループ化を行っています。グループについてデータベースにクエリを実行し、次にそれらの実際の値についてクエリを実行する必要があります。group by

私の質問は、フェッチ戦略を適切に指定する方法です。私が行った方法は、これを実行するために見つけた唯一の方法です(すべてのbxとby値をフェッチしました)-しかし、間違っているように見えるSQLを生成します:

ご覧のとおり、値をa.b3 回取得b1しています。b3フェッチとb6where 句です。

  1. これは DB のパフォーマンスに悪影響を与えると思いますが、正しいでしょうか?
  2. .Fetch一度だけ取得するように呼び出しを変更する方法はありa.bますか?
  3. これは私の問題に対する良いアプローチですか?
0 投票する
2 に答える
855 参照

grails - Grails の自動リレーショナル フェッチ

GORM/Grailsで自動リレーションフェッチを行うことは可能ですか?

次に、この関係を次のように使用します。

0 投票する
1 に答える
2085 参照

java - DatabaseMetaData クエリから結果セットのフェッチ モードを変更できますか?

DatabaseMetaData インスタンスを使用してデータベースを検査しています。DB 内のテーブルのすべての情報を取得し、すべての結果セットを問題なく反復処理します。

繰り返しの最後に、ResultSet の先頭に戻りたいので、beforeFirst() メソッドを呼び出し、次に next() メソッドを呼び出して、ResultSet の最初の要素を取得します。これが私のコードです:

すべての結果を取得しましたが、次の例外があります。

「ここまではすべて正常に見えます。私の接続 (MSAcsess への JDBC-OBDC) によると、私の ResultSet のフェッチ モードは ONLY_FORWARD であるため、次を使用して変更しようとしました。

予約モードを許可するために...しかし、それは私を許可しません。新しい例外:

フェッチ モードを DatabaseMetaData からの結果セットに設定することは可能ですか? どうすればできますか??

ありがとう。

0 投票する
1 に答える
827 参照

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 ライブラリの関数を直接叩くか、パーサーを満たす独自の拡張メソッドを登録する必要があるようです。

ファンキー。