2011-01-17 6 views
5

私はこれについていくつか検索して何も表示しませんでした。 discriminatorに基づいてオブジェクトのセットを返すためのHibernateクエリを作成することは可能ですか?NHibernateのdiscriminatorによるクエリ

私は具体的なクラスUserTypeAとUserTypeBによって拡張されたAbstractUserクラスを持っています。私はクラスごとのテーブルを使用して、NHibernateでクラスをマップするので、UserTypeAとUserTypeBは両方とも異なるテーブル値に同じテーブルに格納されます。ここに私の弁別子マッピングプロパティがあります:

<discriminator column="Type" type="string"/> 

私はユーザーの種類の名前を含むテーブル内の列を持っています。私はこれを使用してNHibernateクエリを実行することが可能かどうか疑問に思っています。

私はこの試みた:

public IList<DomainBase> FindByType(string typeName, Type type) 
{ 
    string query = "from " + type.Name + " k where k.Type = " + typeName; 
    return Session.CreateQuery(query).List<DomainBase>(); 
} 

をしかし、タイプが実際にクラスのプロパティは、テーブル内だけの列ではないので、これは明らかに動作しません。弁別者として財産を使用する方法がない限り、この目的のための財産と弁別者の両方を持つことは重複しているようです。

答えて

6

実際には、これは十分http://www.nhibernate.info/doc/nh/en/index.html#queryhql-whereに記載され:

同様に、特別なプロパティclass は多形永続の場合に インスタンスの判別値にアクセスします。 where句に埋め込まれた.Netクラス名 は、そのディスクリミネータ値に変換された になります。

from Eg.Cat cat where cat.class = Eg.DomesticCat 

また、パラメータとしてSystem.Typeインスタンスを渡すことができます。

+0

これは条件APIで可能ですか? – joniba

+0

@ joniba私はそれが信じています。 –

2

あなたが本当に唯一のタイプで照会したい場合は、その後、私はICriteriaのAPIを使用すると、より便利なオプションだと思う:

public IList<T> FindByType<T>() 
{ 
    return Session.CreateCriteria(typeof(T)).List<T>(); 
} 

今、あなたはIList<UserTypeB> list = FindByType<UserTypeB>()のようにそれを使用することができます。

関連する問題