使用NHibernate

时间:2016-11-23 18:04:38

标签: sql-server nhibernate

我使用session.CreateSQLQuery使用Nhibernate执行复杂查询。 在执行期间,我得到了下一个例外:

  

无法将“System.TimeSpan”类型的对象强制转换为“System.IConvertible”。

似乎NHibernate无法正确处理字段类型'time'并期望整数值。通过使用xml映射文件映射的实体的常规HQL查询,它可以正常工作。但是在我的情况下我需要运行一个sql查询,因此无法指定映射。任何想法如何解决它?看起来像一个NHibernate错误。

NHibernate verison:3.3.1.4

这是完整的堆栈跟踪:

  

无法将类型为“System.TimeSpan”的对象强制转换为类型   'System.IConvertible'。在System.Convert.ToInt64(对象值)
  在NHibernate.Type.TimeSpanType.Get(IDataReader rs,Int32 index)中   p:\ nhibernate-core \ src \ NHibernate \ Type \ TimeSpanType.cs:第32行内部   例外:输入字符串'08:00:00'的格式不正确   在NHibernate.Type.TimeSpanType.Get(IDataReader rs,Int32 index)中   p:\ nhibernate-core \ src \ NHibernate \ Type \ TimeSpanType.cs:第36行at   NHibernate.Type.NullableType.NullSafeGet(IDataReader rs,String name)   在p:\ nhibernate-core \ src \ NHibernate \ Type \ NullableType.cs:第253行   在   NHibernate.Loader.Custom.CustomLoader.ScalarResultColumnProcessor.Extract(对象[]   数据,IDataReader结果集,ISessionImplementor会话)   号码:\ NHibernate的核\ SRC \ NHibernate的\装载机\定制\ CustomLoader.cs:线   458在   NHibernate.Loader.Custom.CustomLoader.ResultRowProcessor.BuildResultRow(对象[]   data,IDataReader resultSet,Boolean hasTransformer,   ISessionImplementor session)in   号码:\ NHibernate的核\ SRC \ NHibernate的\装载机\定制\ CustomLoader.cs:线   395 at NHibernate.Loader.Loader.DoQuery(ISessionImplementor   session,QueryParameters queryParameters,Boolean returnProxies)in   p:\ nhibernate-core \ src \ NHibernate \ Loader \ Loader.cs:第473行   NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor   session,QueryParameters queryParameters,Boolean returnProxies)in   p:\ nhibernate-core \ src \ NHibernate \ Loader \ Loader.cs:第251行   NHibernate.Loader.Loader.DoList(ISessionImplementor session,   QueryParameters queryParameters)中   p:\ nhibernate-core \ src \ NHibernate \ Loader \ Loader.cs:第1564行无法   执行查询[查询] at   NHibernate.Loader.Loader.DoList(ISessionImplementor session,   QueryParameters queryParameters)中   p:\ nhibernate-core \ src \ NHibernate \ Loader \ Loader.cs:第1573行   NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor   session,QueryParameters queryParameters)中   p:\ nhibernate-core \ src \ NHibernate \ Loader \ Loader.cs:第1472行   NHibernate.Impl.SessionImpl.ListCustomQuery(ICustomQuery customQuery,   QueryParameters queryParameters,IList results)in   p:\ nhibernate-core \ src \ NHibernate \ Impl \ SessionImpl.cs:第2104行   NHibernate.Impl.SessionImpl.List(NativeSQLQuerySpecification规范,   QueryParameters queryParameters,IList results)in   p:\ nhibernate-core \ src \ NHibernate \ Impl \ SessionImpl.cs:2091行   NHibernate.Impl.SessionImpl.List [T](NativeSQLQuerySpecification规范,   QueryParameters queryParameters)中   p:\ nhibernate-core \ src \ NHibernate \ Impl \ SessionImpl.cs:2078行   NHibernate.Impl.SqlQueryImpl.ListT in   p:\ nhibernate-core \ src \ NHibernate \ Impl \ SqlQueryImpl.cs:第160行

更新 这是简单的代码,有助于重现问题。 TimeValue在sql server中有'time(0)null'类型。

ISession session = TransactionScopeManager.Instance.GetSession();
iQuery = session.CreateSQLQuery("select TimeValue from TestTable");
result =  iQuery.List();

1 个答案:

答案 0 :(得分:1)

我遇到了相同的错误。我使用的一个临时解决方案是先将“时间”转换为“ Varchar”,然后在代码中将字符串解析为“ TimeSpan”类型。

iQuery = session.CreateSQLQuery("select cast(TimeValue as varchar) as TimeStr from TestTable");
result =  iQuery.List();