NHibernate 名前付きクエリでのマップされていないクラスの使用
-
20-08-2019 - |
質問
NHibernate でカスタムの名前付きクエリを使用しており、これは Person オブジェクトのコレクションを返したいと考えています。Person オブジェクトが NHibernate マッピングにマップされていないため、次の例外が発生します。
System.Collections.Generic.KeyNotFoundException:指定されたキーは辞書には存在しませんでした。
NHibernate.Cfg.Mappings.GetClass(String className) を呼び出すときにクラス名が見つからないため、セッションの作成時にスローされます。これはすべてかなり理解できますが、マッピングを持っていない場合でも、NHibernate にそのクラスを使用するように指示する方法があるのではないかと疑問に思っていました。
解決 5
これを解決するために、私はTupleToPropertyResultTransformerを使用して、プロパティ値のリストを提供することになりました。いくつかの制限は、あなたがTupleToPropertyResultTransformerコンストラクタにあなたの特性を提供するようSQLクエリが同じ順序で結果を返さなければならないということで主なものは、これにあります。
また、プロパティの種類は、あなたがTupleToPropertyResultTransformerを使用して明示的にマッピングすることなく、オブジェクトのコレクションを返すために、SQLクエリを使用するには合理的に簡単な方法を提供することを別になど整数値のみを返す小数の列を持つように注意する必要があるので、推測されますNHibernateの内のオブジェクトます。
他のヒント
なぜあなたは使用しません。
query.SetResultTransformer(Transformers.AliasToBean(typeof(Person)));
これは、プロパティ名として、列の別名を使用してPersonオブジェクトのプロパティへのクエリで、各列のデータを挿入します。
マップされていない型のインスタンスを返すクエリを作成するにはどうすればよいでしょうか?
Michal の言うことは一理あると思います。おそらく予測を検討したほうがよいでしょう。(少なくとも、これがあなたが探しているものだと私は思います)。
マップされた型に対してクエリを作成すると、そのクエリを「DTO」に「投影」できます。これを行うには、NHibernate に認識されるように Person クラスを「インポート」する必要があり、ResultTransformer を使用する必要があります。
このようなもの:
ICriteria crit = session.CreateCriteria (typeof(Person));
// set some filter criteria
crit.SetProjection (Projections.ProjectionList()
.Add (Property("Name"), "Name")
.Add (Property( ... )
);
crit.SetResultTransformer(Transformers.AliasToBean(typeof(PersonView));
return crit.List<PersonView>();
しかし、これは依然として、次のことを行う必要があることを意味します。 輸入 NHibernate がそれを認識できるようにするためのクラスです。
クラスを使用することにより、NHibernateのは、基本的にすべてについて推測されるであろうテーブルあなたは人のために使用するためのもの、およびフィールドマッピングを含む関与。 NHibernateのは、おそらく名前か何かのマッチングに基づいて動的バインディングを行うにハッキングされる可能性がありますが、全体的なアイデアは、XMLファイルを使用してデータベースフィールドに、昔ながらのデータオブジェクトからマッピングを作成することです。
クラスをマッピングしていない本当に良い理由がない場合は、単純にマッピングを追加すると、あなたに最高の結果が得られます...
それはあなたが直接マップされていないクラスに結果を注入する名前付きクエリを使用することはできません、と述べました。あなたは、どのフィールドに、または他の言葉で入れする列マッピングを、それを伝える必要があります。 ;)ただし、名前付きクエリからスカラー値を返すことができますし、それらのオブジェクトの配列を取得し、手動であなたのコレクションを構築することができます。
。