我有一个名为EmployeeEntity
的简单实体,其中包含属性ID
,Name
,Age
,Organisation
和Designation
。我只是使用查询
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>();
但我不想选择所有列,因为我不需要它们。
答案 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
类添加适当的构造函数。