将Nhibernate查询转换为通用列表时出错

时间:2011-03-29 14:35:18

标签: .net nhibernate

我有一个名为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>();

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

2 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:5)

当您使用select Name, Designation, Age, Organisation...查询时,NHibernate实际上将返回IList<object[]>个实例。要解决此问题,请尝试将HQL重写为select new EmployeeEntity(Name, Designation, Age, Organisation)...并向EmployeeEntity类添加适当的构造函数。