3

Person オブジェクトのコレクションを返したい NHibernate でカスタムの名前付きクエリを使用しています。Person オブジェクトは NHibernate マッピングでマップされていません。つまり、次の例外が発生しています。

System.Collections.Generic.KeyNotFoundException: 指定されたキーがディクショナリに存在しませんでした。

NHibernate.Cfg.Mappings.GetClass(String className) を呼び出すときにクラス名が見つからないため、セッションが作成されるときにスローされます。これはすべてかなり理解できますが、NHibernate にクラスのマッピングを取得していなくても、そのクラスを使用するように指示する方法があるかどうか疑問に思っていました。

4

5 に答える 5

9

使用しない理由:

query.SetResultTransformer(Transformers.AliasToBean(typeof(Person)));

列のエイリアスをプロパティ名として使用して、クエリの各列のデータを Person オブジェクトのプロパティに挿入します。

于 2009-03-19T15:37:07.703 に答える
0

このクラスを使用することで、NHibernate は基本的に、Person に使用する予定のテーブルやフィールド マッピングなど、関連するすべてのことを推測します。NHibernate はおそらく、名前の一致などに基づいて動的バインディングを行うためにハッキングされる可能性がありますが、全体的なアイデアは、xml ファイルを使用してプレーンな古いデータ オブジェクトからデータベース フィールドへのマッピングを作成することです。

于 2009-03-19T03:19:03.557 に答える
0

クラスをマップしない正当な理由がない場合は、単にマッピングを追加するだけで最良の結果が得られます...

つまり、名前付きクエリを使用して結果をマップされていないクラスに直接挿入することはできません。どの列をどのフィールドに配置するか、つまりマッピングを指定する必要があります。;) ただし、名前付きクエリからスカラー値を返すことができ、それらのオブジェクト配列を取得してコレクションを手動で構築できます。

于 2009-03-19T03:19:59.030 に答える
0

これを解決するために、TupleToPropertyResultTransformer を使用してプロパティ値のリストを提供することになりました。これにはいくつかの制限があります。主な制限は、TupleToPropertyResultTransformer コンストラクターにプロパティを提供するのと同じ順序で SQL クエリが結果を返さなければならないことです。

また、プロパティの型は推測されるため、整数値のみを返す 10 進列などには注意する必要があります。それとは別に、TupleToPropertyResultTransformer を使用すると、NHibernate 内でオブジェクトを明示的にマッピングせずに、SQL クエリを使用してオブジェクトのコレクションを返すかなり簡単な方法が提供されます。 .

于 2009-03-19T03:43:12.110 に答える