2011-03-29 21 views
9

que tiene una entidad simple llamado EmployeeEntity con propiedades ID, Name, Age, Organisation y Designation. Estoy consultando la base de datos utilizando la consultaconversión de consulta Nhibernate a la lista genérica

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 

pero en la conversión de mi tipo, es una excepción:

No se pudo ejecutar la consulta [SQL: SQL no disponible]

con InnerException:

El valor "System.Object []" no es de tipo "NHiberna teTest.EmployeeEntity "y no se puede usar en esta colección genérica. Nombre
Parámetro: valor

aunque funciona muy bien usar esta consulta:

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

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

pero no quiero para seleccionar todas las columnas porque yo no los necesito.

Respuesta

4

Cuando realiza una consulta con select Name, Designation, Age, Organisation..., NHibernate realmente devolverá una instancia de IList<object[]>. Para superar esto, intente reescribir su HQL a select new EmployeeEntity(Name, Designation, Age, Organisation)... y agregue un constructor apropiado a la clase EmployeeEntity.

+0

Hola, gracias por la respuesta, pero en constructor de adición y que querying..it me da esta excepción "NHibernate .InvalidProxyTypeException: los siguientes tipos no se pueden usar como proxies: NHibernateTest.EmployeeEntity: tipo debe tener un constructor de no argumentos visible (público o protegido) " lo que significa que una entidad con constructor no es compatible con nhibernate. –

+0

@pijush, solo significa que no puedes tener solo un constructor sin parámetros. Simplemente agrega un constructor sin parámetros y listo. – Vadim

11

Si solo desea un determinado conjunto de columnas, cree una clase que corresponda una a una con sus columnas. De este modo:

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

A continuación, sólo tiene que añadir un transformador resultado de la consulta

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

Hola Vadim, Gracias por su respuesta. ¿Quiere decir que tengo una clase diferente cada vez que selecciono algunas columnas de toda la tabla? Si es así, mis clases crecerán según la selección. –

+0

@pijush, es una práctica bastante común, mira aquí para una buena discusión http://stackoverflow.com/questions/4636769/using-dtos-and-bos – Vadim

+0

gracias por la ayuda .. Creo que puedo seguir adelante con tu sugerencia –