1

オブジェクトをロードするときに特定のプロパティをスキップするように Hibernate 名前付きプロシージャを構成できますか? これらは、テーブル内で無視したい列ではありません。それらは列に対応しないオブジェクトのプロパティであり、名前付きプロシージャを使用するときにそれらを null のままにしたいと考えています。(これらのプロパティを入力したい状況は他にもあります)。

SQL テーブルから読み取られた多くのプロパティと、式を使用して計算された 1 つのプロパティを持つ検査オブジェクトがあります。

...
<property name="InspectionDate" type="DateTime" not-null="false" />
<property name="LastCompletedDate" type="DateTime" not-null="false" 
            formula="(select max(.....long formula.....)"/>
...

これは、NHibernate がインスペクションをロードするときに正常に機能します。問題は、ストアド プロシージャを使用してインスペクションのリストを取得するときに発生します。

<sql-query name="GetOverdueInspection">
      <return class="Inspection" />
      exec dbo.usp_GetOverdueInspection :dueDate
</sql-query>

これは例外をスローします:

10011 [10] INFO NHibernate.Loader.Loader (null) - exec dbo.usp_GetOverdueInspection @p0
NHibernate: exec dbo.usp_GetOverdueInspection @p0; @p0 = '4/29/2013 7:23:41 PM'10846 [10] 
WARN NHibernate.Util.ADOExceptionReporter (null) - System.ArgumentNullException: Value cannot be null.
Parameter name: fieldName
   at System.Data.SqlClient.SqlDataReader.GetOrdinal(String name)
   at NHibernate.Driver.NHybridDataReader.GetOrdinal(String name)
   at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name)
   at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String[] names, ISessionImplementor session, Object owner)
   at NHibernate.Type.AbstractType.Hydrate(IDataReader rs, String[] names, ISessionImplementor session, Object owner)
   at NHibernate.Persister.Entity.AbstractEntityPersister.Hydrate(IDataReader rs, Object id, Object obj, ILoadable rootLoadable, String[][] suffixedPropertyColumns, Boolean allProperties, ISessionImplementor session)
   at NHibernate.Loader.Loader.LoadFromResultSet(IDataReader rs, Int32 i, Object obj, String instanceClass, EntityKey key, LockMode lockMode, ILoadable rootPersister, ISessionImplementor session)
   at NHibernate.Loader.Loader.InstanceNotYetLoaded(IDataReader dr, Int32 i, ILoadable persister, EntityKey key, LockMode lockMode, EntityKey optionalObjectKey, Object optionalObject, IList hydratedObjects, ISessionImplementor session)
   at NHibernate.Loader.Loader.GetRow(IDataReader rs, ILoadable[] persisters, EntityKey[] keys, Object optionalObject, EntityKey optionalObjectKey, LockMode[] lockModes, IList hydratedObjects, ISessionImplementor session)
   at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, BooleanreturnProxies)
   at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)   at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
   at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)
10849 [10] ERROR NHibernate.Util.ADOExceptionReporter (null) - Value cannot be null.
Parameter name: fieldName

この名前付きクエリを使用するときに LastCompletedDate を null のままにするように NHibernate に指示するにはどうすればよいですか?

4

1 に答える 1

1

プロパティ LastCompletedDate を遅延としてマッピングすることで、これを回避できます。これは実際にはあなたの質問に対する答えではなく、試すことができる回避策です。もちろん、これは LastCompleteDate プロパティが常に遅延して読み込まれることを意味します。これは、ユース ケースによっては悪いことになる可能性があります。

<property name="LastCompletedDate" type="DateTime" not-null="false" 
        lazy="true" formula="(select max(.....long formula.....)"/>

それ以外の場合、意図した機能を達成するために私が見る唯一の方法は、基本クラスを使用し、何も追加せずに2回サブクラス化し、1つのサブクラスを式でマッピングし、別のサブクラスを式なしでマッピングし、それらをキャストしてコードで作業することです同じ型を持つ基本クラス。おそらくいくつかの悪い欠点があります。

于 2013-04-30T08:05:42.443 に答える