NHibernate での IUserType に対するクエリの構築
-
23-09-2019 - |
質問
NHibernate でカスタム IUserType フィールドに対するクエリを作成するにはどうすればよいですか?
すなわち:私はブラウンフィールド アプリケーションに取り組んでいます。データベースに「State」というフィールドがあり、これには特定のオブジェクトがどのような状態にあるかを表す文字が含まれています。
私のコードでは、これを列挙型として表現したいので、各状態の値を持つ列挙型を作成し、データベースの文字値から列挙型に変換し、選択と更新のためにその逆の変換を行う IUserType を作成しました。
次のようなクエリを作成したいと思います。
session.CreateCriteria<MyType>().Add(Expression.Eq("State", StateEnum.Complete))
ただし、このクエリでは例外がスローされます。
could not resolve property: State of: MyNamespace.MyType
おそらく、NHibernate が StateEnum 型を指定した DB の char フィールドに対して選択を行う方法を知らないためです。
解決
クラスとマッピングは次のようになります。
class MyType
{
public virtual StateEnum State { get; set; }
}
<class name="MyType">
<property name="State" type="MyNamespace.MyEnumUserType, MyDll" />
</class>
Hibernate には enum 用の 3 つの組み込みマッパーがあります。
- PersistentEnumType int 列にマップされ、マッピング内で宣言されていません。
- EnumStringType varchar 列にマップされます。値は列挙型の ToString() 値です。
- EnumCharType char 列にマップされます。値は次の結果です。
(char) (int) enumvalue
.
所属していません StackOverflow