2011-03-29 27 views
9

Ho una semplice entità chiamata EmployeeEntity con proprietà ID, Name, Age, Organisation, e Designation. Sto solo interrogando il database utilizzando la queryErrore durante la conversione di interrogazione NHibernate alla lista generica

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 

ma sulla conversione al mio tipo, è un'eccezione:

Impossibile eseguire la query [SQL: SQL non disponibile]

con InnerException:

Il valore "System.Object []" non è di tipo "NHiberna teTest.EmployeeEntity "e non può essere utilizzato in questa raccolta generica. Nome
parametro: valore

se funziona bene con questa query:

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

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

ma io non voglio per selezionare tutte le colonne, perché non ho bisogno di loro.

risposta

4

Quando si esegue una query con select Name, Designation, Age, Organisation..., NHibernate restituirà effettivamente un'istanza IList<object[]>. Per risolvere questo problema, provare a riscrivere l'HQL su select new EmployeeEntity(Name, Designation, Age, Organisation)... e aggiungere un costruttore appropriato alla classe EmployeeEntity.

+0

Ciao, grazie per la risposta, ma sul costruttore di aggiungere e di querying..it mi dà questa eccezione "NHibernate .InvalidProxyTypeException: I seguenti tipi non possono essere utilizzati come proxy: NHibernateTest.EmployeeEntity: type dovrebbe avere un costruttore visibile (pubblico o protetto) senza argomenti " che significa che un'entità con costruttore non è supportata da nhibernate. –

+0

@pijush, significa solo che non puoi avere solo un costruttore non parametrico. Aggiungi semplicemente un costruttore senza parametri e sei a posto. – Vadim

11

Se si desidera solo un determinato set di colonne, creare una classe che esegue il mapping uno a uno con le colonne. In questo modo:

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

È quindi solo bisogno di aggiungere un trasformatore risultato alla tua richiesta

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

Hi Vadim, Grazie per la risposta. Intendi dire che ho creato una classe diversa ogni volta che seleziono alcune colonne dell'intero tavolo intero. Se è così, le mie lezioni cresceranno in base alla selezione. –

+0

@pijush, è una pratica abbastanza comune, vedere qui per una buona discussione http://stackoverflow.com/questions/4636769/using-dtos-and-bos – Vadim

+0

grazie per l'aiuto .. Penso che posso andare avanti con il tuo suggerimento. –

Problemi correlati