【问题标题】:Error while conversion of Nhibernate query to generic list将 Nhibernate 查询转换为通用列表时出错
【发布时间】:2011-03-29 14:35:17
【问题描述】:

我有一个名为EmployeeEntity 的简单实体,其属性为IDNameAgeOrganisationDesignation。我只是使用查询查询数据库

IQuery query = session.CreateQuery(
    "select Name, Designation, Age, Organisation FROM EmployeeEntity " +
    "group by Name, Designation, Age, Organisation");

IList<EmployeeEntity> employee = query.List<EmployeeEntity>(); // Throws error

但在转换为我的类型时,它会引发异常:

无法执行查询[SQL:SQL 不可用]

InnerException:

值“System.Object[]”不是“NHibernateTest.EmployeeEntity”类型,不能在这个通用集合中使用。
参数名称:值

虽然使用此查询可以正常工作:

IQuery query = session.CreateQuery("select e FROM EmployeeEntity e group by e");

IList<EmployeeEntity> employee = query.List<EmployeeEntity>();

但我不想选择所有列,因为我不需要它们。

【问题讨论】:

    标签: .net nhibernate


    【解决方案1】:

    如果您只想要一组特定的列,请创建一个与您的列一对一映射的类。像这样:

    public class EmployeeView
    {
        public string Name { get; set; }
        public string Designation { get; set; }
        public int Age { get; set; }
        public string Organization { get; set; }
    }
    

    然后您只需将结果转换器添加到您的查询中

    IQuery query = session
        .CreateQuery("select Name ,Designation ,Age ,Organisation  FROM EmployeeEntity   group by  Name ,Designation ,Age ,Organisation")
        .SetResultTransformer(Transformers.AliasToBean<EmployeeView>());
    
    Ilist<EmployeeEntity> employee= query.List<EmployeeView>();
    

    【讨论】:

    • 您好 Vadim,感谢您的回复。你的意思是说我每次从整个表格中选择几列时都会做一个不同的课程。如果是这样,我的课程将根据选择而增长。
    • @pijush,这是一种相当普遍的做法,请参阅此处进行良好的讨论stackoverflow.com/questions/4636769/using-dtos-and-bos
    • 感谢您的帮助.. 我想我可以继续您的建议。
    【解决方案2】:

    当您使用select Name, Designation, Age, Organisation... 进行查询时,NHibernate 实际上会返回一个IList&lt;object[]&gt; 实例。要克服这个问题,请尝试将您的 HQL 重写为 select new EmployeeEntity(Name, Designation, Age, Organisation)... 并将适当的构造函数添加到 EmployeeEntity 类。

    【讨论】:

    • 嗨,感谢您的回复,但在添加构造函数而不是查询时..它给了我这个异常“NHibernate.InvalidProxyTypeException:以下类型可能不能用作代理:NHibernateTest.EmployeeEntity:类型应该有可见的(公共或受保护的)无参数构造函数”,这意味着 nhibernate 不支持具有构造函数的实体。
    • @pijush,它只意味着你不能只有一个非无参数的构造函数。只需添加一个无参数的构造函数就可以了。
    猜你喜欢
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多