2011-03-29 14 views
9

Mam proste podmiot o nazwie EmployeeEntity o właściwościach ID, Name, Age, Organisation i Designation. Ja po prostu przeglądając bazę danych przy użyciu kwerendybłąd podczas konwersja z NHibernate kwerendy do listy rodzajowe

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 

ale na konwersję do mojego typu, to rzuca wyjątek:

Nie można wykonać zapytania [SQL: SQL niedostępna]

z InnerException:

wartość "System.Object []" nie jest typu „NHiberna teTest.EmployeeEntity "i nie mogą być używane w tej ogólnej kolekcji. Nazwa
Parametr: wartość

chociaż działa prawidłowo przy użyciu tej kwerendy:

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

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

ale nie chcę, aby zaznaczyć wszystkie kolumny, bo ich nie potrzebują.

Odpowiedz

4

Podczas próby z select Name, Designation, Age, Organisation..., NHibernate zwróci instancję IList<object[]>. Aby temu zaradzić, spróbuj przepisać swój HQL na select new EmployeeEntity(Name, Designation, Age, Organisation)... i dodaj odpowiedni konstruktor do klasy EmployeeEntity.

+0

Witam, dzięki za odpowiedź, ale po dodaniu konstruktora niż querying..it daje mi ten wyjątek „NHibernate .InvalidProxyTypeException: Następujące typy nie mogą być używane jako proxy: NHibernateTest.EmployeeEntity: type powinien mieć widoczny (publiczny lub chroniony) konstruktor bezargumentowy " co oznacza, że ​​jednostka z konstruktorem nie jest obsługiwana przez nhibernate. –

+0

@pijush, oznacza to tylko, że nie można mieć konstruktora bez parametrów. Po prostu dodaj konstruktor bez parametrów i możesz już iść. – Vadim

11

Jeśli potrzebujesz tylko określonego zestawu kolumn, utwórz klasę, która mapuje jeden do jednego z kolumnami. Tak:

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

Następnie wystarczy dodać transformator wynik zapytaniu

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

Cześć Vadim, Dziękuję za odpowiedź. Czy chcesz powiedzieć, że tworzę inną klasę za każdym razem, gdy wybieram kilka kolumn z całej tabeli. Jeśli tak, moje zajęcia będą rosły zgodnie z wyborem. –

+0

@pijush, jest to dość powszechna praktyka, zobacz tutaj dobrą dyskusję http://stackoverflow.com/questions/4636769/using-dtos-and-bos – Vadim

+0

dzięki za pomoc .. Myślę, że mogę iść z twoja sugestia. –

Powiązane problemy