使用 NHibernate 查询“时间”字段时出现无效的强制转换异常
Posted
技术标签:
【中文标题】使用 NHibernate 查询“时间”字段时出现无效的强制转换异常【英文标题】:Invalid cast exception while querying 'time' field with NHibernate 【发布时间】:2017-04-07 20:57:04 【问题描述】:我有一个使用 Nhibernate 使用 session.CreateSQLQuery 执行的复杂查询。 在执行期间,我遇到了下一个异常:
无法将“System.TimeSpan”类型的对象转换为“System.IConvertible”类型。
似乎 NHibernate 无法正确处理字段类型 'time' 并期望那里的整数值。它适用于使用 xml 映射文件映射的实体的常规 HQL 查询。但是在我的情况下,我需要运行一个 sql 查询,因此无法指定映射。任何想法如何解决它?看起来像一个 NHibernate 错误。
NHibernate 版本: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 行 NHibernate.Type.NullableType.NullSafeGet(IDataReader rs,字符串名称) 在 p:\nhibernate-core\src\NHibernate\Type\NullableType.cs:253 行 在 NHibernate.Loader.Custom.CustomLoader.ScalarResultColumnProcessor.Extract(Object[] 数据、IDataReader 结果集、ISessionImplementor 会话)中 p:\nhibernate-core\src\NHibernate\Loader\Custom\CustomLoader.cs:line 458 在 NHibernate.Loader.Custom.CustomLoader.ResultRowProcessor.BuildResultRow(Object[] 数据,IDataReader 结果集,布尔 hasTransformer, ISessionImplementor 会话)中 p:\nhibernate-core\src\NHibernate\Loader\Custom\CustomLoader.cs:line 395 在 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 会话, 查询参数查询参数)在 p:\nhibernate-core\src\NHibernate\Loader\Loader.cs:line 1564 不能 执行查询 [查询] 在 NHibernate.Loader.Loader.DoList(ISessionImplementor 会话, 查询参数查询参数)在 p:\nhibernate-core\src\NHibernate\Loader\Loader.cs:line 1573 at NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor 会话,QueryParameters 查询参数)在 p:\nhibernate-core\src\NHibernate\Loader\Loader.cs:第 1472 行 NHibernate.Impl.SessionImpl.ListCustomQuery(ICustomQuery customQuery, QueryParameters queryParameters, IList 结果)在 p:\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:line 2104 at NHibernate.Impl.SessionImpl.List(NativeSQLQuerySpecification 规范, QueryParameters queryParameters, IList 结果)在 p:\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:line 2091 at NHibernate.Impl.SessionImpl.List[T](NativeSQLQuerySpecification 规范, 查询参数查询参数)在 p:\nhibernate-core\src\NHibernate\Impl\SessionImpl.cs:line 2078 at NHibernate.Impl.SqlQueryImpl.ListT 在 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();
【问题讨论】:
也许你的代码中存在错误?我们无法判断,因为您不显示映射和查询。 :) 由于我使用的是 sql 查询,因此不涉及映射。但我添加了演示问题的代码 【参考方案1】:我遇到了同样的错误。我使用的一个临时解决方案是先将“时间”转换为“Varchar”,然后在代码中将字符串解析为“TimeSpan”类型。
iQuery = session.CreateSQLQuery("select cast(TimeValue as varchar) as TimeStr from TestTable");
result = iQuery.List();
【讨论】:
以上是关于使用 NHibernate 查询“时间”字段时出现无效的强制转换异常的主要内容,如果未能解决你的问题,请参考以下文章
查询系统字段时出现CKError:拒绝“未知字段'createdAt'”
删除时出现中继错误:RelayMutationQuery:胖查询中的字段名称无效