使用AliasToBeanResultTransformer返回整数列表时,未发现Nhibernate属性异常

时间:2014-05-26 18:15:07

标签: nhibernate nhibernate-mapping

尝试使用AliasToBeanResultTransformer从原始查询返回整数列表时出现奇怪错误。以下是代码PersonIdchar(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。有没有办法让这个工作不用改变架构?

1 个答案:

答案 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>();