Ошибка при преобразовании запроса Nhibernate в общий список

9 pijush Dutta [2011-03-29 17:35:00]

У меня есть простой объект с именем 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>();

но я не хочу выбирать все столбцы, потому что они мне не нужны.

.net nhibernate


2 ответа


11 Vadim [2011-03-29 18:38:00]

Если вам нужен только определенный набор столбцов, создайте класс, который сопоставляет один к одному с вашими столбцами. Например:

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

4 Anton Gogolev [2011-03-29 17:49:00]

Когда вы запрашиваете select Name, Designation, Age, Organisation..., NHibernate фактически вернет экземпляр IList<object[]>. Чтобы преодолеть это, попробуйте переписать HQL на select new EmployeeEntity(Name, Designation, Age, Organisation)... и добавить соответствующий конструктор в класс EmployeeEntity.