問題タブ [nhibernate-criteria]
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 - リレーショナル マッピングを持たない QueryOver JoinAlias
2 つのテーブルを結合する必要がありますが、それらのフィールドにはありません。それは可能ですか?
例えば
TableA (ID, MachineID, EquipmentID)
Machine (MachineID, Description)
のマッピングがありTableA.MachineID => Machine.MachineID
ます。そのために Join を使用できますが、問題はありません。
今、私は参加する必要がありTableA.EquipmentID => Machine.MachineID
ます。フィールドをマッピングせずにこれを行うことは可能ですか?
nhibernate - NHibernateのサブクエリから値を取得するにはどうすればよいですか?`
私は現在、スレッド内のメッセージの数を出力する必要があるメッセージボードを構築しています。
- ID
- 名前
- MessageCount
プレーンSQLでは次のようになりますが、の作成方法に関するドキュメントが見つかりませんinline select
。
デタッチされたクエリを使用して結果セットを制限する方法の例のみを見つけました。それらから実際の値を選択する方法は見つかりませんでした。
NHibernateでインライン選択を行うにはどうすればよいですか?私はHQLよりもICriteriaを使用することを好みます。
編集:理解しやすくするために、複雑すぎる質問を簡略化しました。
c# - NHibernate を使用してオブジェクトを複数レベルの深さと幅でフェッチする方法は?
データベースから約 10,000 個のオブジェクトをロードする必要がある場合があります。データモデルは次のようなものです。
これは、いくつかのクエリに従ってデータベースから SimulationObjects のリストをクエリし、そのすべてのプロパティ (参照) とサブアイテムをクエリすることを意味します。
コレクションの数量は次のとおりです。
- SimulationObject - 「where」のパラメータに応じて約 6000 ~ 1200
- SimulationObject.Results - 約 5 ~ 40 項目
- SimulationObject.Results.Items - 約 0 ~ 2 アイテム
- SimulationObject.PreviewData - 約 0 ~ 2 アイテム
- SimulationObject.PreviewData.Items - 約 1 ~ 3 アイテム
通常、私は次のようにします:
ただし、クエリでデカルト積 (PreviewDataAndSubItemsCount x ResultsAndSubItemsCount 返される行の量を意味する) を作成するための「PreviewData」アイテムをフェッチする必要もありますが、これは非常に効果的ではありません。また、大量の SumulationObjects (前述のように約 10000) をロードする必要があるため、遅延ロードを行うことはできません (10000 クエリ..他にも問題があるため、これは考慮すべき代替手段ではありません)。
では、代替手段は何ですか?複雑なオブジェクト グラフをメモリにロードするには、どのような戦略を使用しますか?
ありがとう。
fluent-nhibernate - マルチユーザー環境でのNHibernate QueryCache
私たちの Web アプリケーション (ASP.NET) では、Fluent NHibernate (2.1.2) を使用して、エンティティだけでなく、クエリ (基準 API を使用してクエリを生成する) に対しても第 2 レベルのキャッシュを使用しています。Session-Per-Request パターンと 1 つの SessionFactory アプリケーション全体を使用しているため、キャッシュはすべての Nhibernate-Sessions を提供します。
問題:
従来のデータベース (Oracle) のデータ オブジェクトでは、ユーザーごとに異なる "アクセス権" に対処する必要があります。つまり、ビューはユーザー権限ごとに返されるデータを制限します。したがって、たとえば、まったく同じクエリを使用して基準によって同じビューがクエリされますが、ユーザー権限に応じて異なる結果セットが返されるという状況があります。
ここで、パフォーマンスを向上させるために、前述のクエリがキャッシュされます。しかし、これはユーザー A のアクションからクエリが最初に起動されたときに、ユーザー A がアクセス権を持つ ID である結果の ID をキャッシュするという問題を引き起こします。その直後に、同じクエリがユーザー B のアクションから起動され、Nhibernate は (ユーザー A からの) 最初の呼び出しからキャッシュされた ID を選択し、ユーザー B がアクセス権を持っていない対応するエンティティを取得しようとします (または、すべてではないかもしれません)。イベントリスナーで権利をチェックしているため、前述のケースではアプリケーションがアクセス権例外をスローします。
考え:
クエリをキャッシュしないことは、これに対するオプションになる可能性があります。しかし、パフォーマンスは明らかに私たちのアプリケーションの問題であるため、ユーザーごとにクエリをキャッシュすることが本当に望ましいでしょう。
ユーザーごとに SessionFactory を作成して、ユーザーごとにキャッシュを作成することも考えました。しかし、これは明らかにリソースに影響を与え、やややり過ぎであり、正直なところオプションではありません。複数のユーザー (ユーザー グループを考えてください) がアクセスし、操作する必要があるエンティティが存在するためです。 「個々のキャッシュ」などの古いデータに関する問題。だから、それはいけません。
これに対する有効な解決策は何ですか?そのような状況の「ベストプラクティス」のようなものはありますか?
考え:
昨日これに行き詰まり、解決策が見つからなかったので、寝て、今日、ある種の「ハック」を思いつきました。
NHibernate はクエリ テキストとパラメータ (「句」) によってクエリをキャッシュするため、クエリの署名でユーザーに依存するものを「密輸」する方法を考えました。これにより、ユーザーごとにすべてのクエリがキャッシュされますが、クエリ自体を変更します (クエリの結果に関して)。
したがって、「創造性」が私をこれに導きました(サンプルコード):
この行:
.Add(Expression.Sql(string.Format("{0} = {0}", userName)))
これは常に true と評価されますが、Nhibernate の観点からクエリを「変更」するため、個別の「userName」ごとにキャッシュされます。
私は知っています、それはちょっと醜いです、そして私はそれに本当に満足していません. 誰かが別のアプローチを知っていますか?
前もって感謝します。
nhibernate - NHibernateFetchModeデカルト積
私のオブジェクトグラフでは、VendorServiceRateChangeには遅延ロードされたプロパティIList<VendorService>
VendorServiceListがあり、VendorServiceには遅延ロードされたプロパティがありますIList<ClientService>
。
次のコードを実行すると、VendorServiceListとClientServiceListの間にデカルト積が得られます。
私のVendorServiceListとしてデカルト積にならないCriteriaまたはDetachedCriteriaを使用してこのクエリを構造化する方法はありますか?「VendorServiceList.ClientServices」のフェッチをコメントアウトして、最初のクエリが戻った後にInitialize呼び出しでループする必要はありません。
前もって感謝します。
performance - NHibernateソートパフォーマンス
ソートされたクエリでパフォーマンスが低下します。
これは、NHibernateによってクエリが生成およびレンダリングされる方法です。
太字の部分(**-記号内)は、すべての結果をフェッチして整理しています。これには時間がかかります。このクエリをより効率的にする方法はありますか?オーバーヘッドをあまり発生させずに、並べ替えとページングを可能にしたいだけです。
NHibernate2.1を使用しています。私の問題に関連する将来のリリースでの改善はありますか?
よろしく、マティアス
nhibernate - 要素のコレクションを射影するNHibernate
特定のマネージャに対して未処理のリクエストをすべて選択したいと考えています。マネージャーは複数のチームを持つことができます。
権限に基づいてさまざまな制限を適用するクエリを作成し、クエリを変更して、行数、存在チェック、サブクエリなどを提供します。
この構成では QueryOver を使用しますが、代わりに ICriteria を使用することもできます。
次のクラスが与えられます。
これは私が試している現在のクエリです (これは機能しません)。
ユーザーを選択する HQL は次のようになります。
しかし、アクセス許可に基づく他の制限で構成できないため、HQL を使用したくありません。また、他のクエリで構成して、行数/存在チェックなどに変換することもできません.
nhibernate - nHibernate: QueryOver および CreateCriteria でエンティティ名を使用する
2 つの hbm.xml マッピング ファイルがあります。これらは、クラス テーブルとクラス エンティティ名のプロパティを除いて同一です。それらは同じエンティティに入力することになっています。それらには、entity-name= Alpha と Beta、table= PersonAlpha と PersonBeta があります。
QueryOver と Criteria の両方を使用して、エンティティ Person を設定しようとしました。
エンティティ名を参照しているため、nHibernate は使用するマッピング ファイルを認識していると思いましたが、Profiler によると、上記の各ステートメントは PersonAlpha テーブルと PersonBeta テーブルの両方に対して SQL を生成します。どうしてこれなの?
バージョン 3.2.0 2001 og nHibernate を使用しています。
ありがとう!
nhibernate - NHibernateで重複のないマルチレベルコレクションをロードする
私の質問はこれに非常に似ています(実際には答えられませんでした):Nhibernate:第2レベルのコレクションで明確な結果
私はこのオブジェクトモデルを持っています:
それらは1対多の関係です。EntityBとCには、その親オブジェクトへのオブジェクト参照がありません。
デカルト結合を回避するために、次の3つのSQLクエリのようなものを実行して、コレクションを完全にロードしたいと思います。
これにより、DALはオブジェクトを適切に埋めるためのすべての情報を取得します。ただし、EntityBはその親が誰であるかを認識していないため、コレクションの適切な入力を処理するのはnHibernateである必要があります。
できますか?
デカルト積を使用してこの回避策を実行できますが、コレクションセッターを提供するようにモデルを変更する必要があります。これは、DALに関する技術的な問題のパッチとしての資格があります。
hibernate - NHibernate-先物でフェッチ
私はこの流暢なNHibernateマッピングを持っています:
要約する:
- 損失には多くの支払い、準備金、ステータスがあります
- 支払いには1つの予約があります
次の制約を使用して、損失とその支払いおよび準備金(ステータスではない)を取得しようとしています。
- 「status.Statusnotin(1,2,7)」のステータスが少なくとも1つある損失のみをフェッチします。
- Loss.Paymentsをフェッチするのは、「loss.Payment.Type = 2およびloss.Payment.Reserve.Status!= 4)」の場合のみです。
- Reserve.Status!=3の場合にのみLoss.Reservesをフェッチします
2つの並列関係を取得しようとしているので、ここで説明されているように、デカルト積を回避するためにマルチクエリまたは先物を使用する必要があります(右?):http://ayende.com/blog/4367/eagerly-loading-entity-associations- nhibernateで効率的に
私はこのクエリを(HQLで)思いついた:
ただし、このクエリを実行すると、次のエラーが発生します。NHibernate.HibernateException:マルチクエリ[..SQLクエリ]の実行に失敗しました---> System.ArgumentException:値「System.Object[]」はタイプ「エンティティ」ではありません.Loss」であり、この汎用コレクションでは使用できません。
私がここで間違っていることの手がかりはありますか?
ステータス制約を削除すると、クエリは機能します。
ただし、結果は私が望むものではありません(私はその制約が必要です)。
何かアドバイス ?
ああ、HQLの使用は「必須」ではありません。これが、LinqまたはQueryOverを使用して可能であれば、問題はありません。
ありがとう!