尝试使用AliasToBeanResultTransformer
从原始查询返回整数列表时出现奇怪错误。以下是代码(PersonId
是char(9)
):
nHibernateService
.CurrentSession
.CreateSQLQuery(
@"
select PersonId
from Person")
.SetResultTransformer(new NHibernate.Transform.AliasToBeanResultTransformer(typeof(int)))
.List<int>();
错误是:
NHibernate.PropertyNotFoundException:找不到类'System.Int32'中属性'PersonId'的setter at NHibernate.Properties.ChainedPropertyAccessor.GetSetter(Type theClass,String propertyName) at NHibernate.Transform.AliasToBeanResultTransformer.TransformTuple(Object [] tuple,String [] aliases) 在NHibernate.Loader.Custom.CustomLoader.GetResultList(IList结果,IResultTransformer resultTransformer) 在NHibernate.Impl.SessionImpl.ListCustomQuery(ICustomQuery customQuery,QueryParameters queryParameters,IList results) 在NHibernate.Impl.SessionImpl.List(NativeSQLQuerySpecification规范,QueryParameters queryParameters,IList结果) 在NHibernate.Impl.SessionImpl.List [T](NativeSQLQuerySpecification规范,QueryParameters queryParameters)
我们正在使用结果转换器,因为数据库类型ID是char(9),但PersonId是代码中的Int32。有没有办法让这个工作不用改变架构?
答案 0 :(得分:2)
在这种情况下,我们不需要IResultTransformer
。这应该足够了:
nHibernateService
.CurrentSession
.CreateSQLQuery(" select PersonId from Person")
.List<int>();
将列(带别名)转换为DTO对象时,结果转换器非常有用。在这种情况下,返回单个ValueType
,无需转换。
如果DB(例如SQL Server)的值PersonId存储为varchar
,我们可以简单地使用CAST函数进行转换
nHibernateService
.CurrentSession
.CreateSQLQuery(@" select CAST(PersonId as int)
from Person")
.List<int>();