我使用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();
答案 0 :(得分:1)
我遇到了相同的错误。我使用的一个临时解决方案是先将“时间”转换为“ Varchar”,然后在代码中将字符串解析为“ TimeSpan”类型。
iQuery = session.CreateSQLQuery("select cast(TimeValue as varchar) as TimeStr from TestTable");
result = iQuery.List();