2009-03-19 18 views
3

私は、Personオブジェクトのコレクションを返すNHibernateでカスタムの名前付きクエリを使用しています。 Personオブジェクトは、私は次の例外を取得しています意味NHibernateのマッピングにマッピングされていません。NHibernateの名前付きクエリでUnmappedクラスを使用する

System.Collections.Generic.KeyNotFoundException: 指定されたキーは、 辞書には存在しませんでした。

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

答えて

0

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

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

0

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

0

クラスをマッピングしていない本当に良い理由がない場合は、単純にマッピングを追加すると、最良の結果を得るあなたを与えるだろう...と述べ

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

9

は、なぜあなたは使用しません:それは、プロパティ名として、列の別名を使用してPersonオブジェクトのプロパティへのクエリで、各列のデータを挿入します

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

2

マッピングされていない型のインスタンスを返すクエリを作成するにはどうすればよいですか?

私はMichalがここでポイントを持っていると思いますが、おそらく投影を見てみるべきです。 (少なくとも、これは私があなたが探していると思うものです)。

マップされた型のクエリを作成した後、そのクエリを 'DTO'に '投影'できます。 これを実行するには、Personクラスを 'import'して、NHibernateに知られている必要があり、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はそれについて知っているように、あなたは、importにクラスを持っています意味します。

+0

投影は私が探しているものではありませんが、TupleToPropertyResultTransformerまたはAliasToBeanトランスフォーマがそのジョブを行います。私はそれにAliasToBeanのトランスを使用する新しいコンストラクタを与えるクラスにアクセスする必要はありませんので、私はTupleToPropertyResultTransformerを使用しています – lomaxx

関連する問題