2011-03-29 27 views
9

我有一個特性IDNameAgeOrganisation,並且Designation稱爲EmployeeEntity一個簡單的實體。我使用的查詢錯誤而NHibernate的查詢皈依到泛型列表

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 []」不是類型「NHiberna teTest.EmployeeEntity「並且不能用於這個通用集合。
參數名:價值

雖然它使用此查詢工作正常:

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

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

,但我不想選擇所有列,因爲我不需要他們。

回答

4

當你用select Name, Designation, Age, Organisation...查詢時,NHibernate實際上會返回一個IList<object[]>實例。爲了解決這個問題,可以嘗試將你的HQL重寫爲select new EmployeeEntity(Name, Designation, Age, Organisation)...,併爲EmployeeEntity類添加一個合適的構造函數。

+0

您好,感謝您的答覆,但增加的構造,比querying..it給了我這個異常「的NHibernate .InvalidProxyTypeException:以下類型不能用作代理: NHibernateTest.EmployeeEntity:type應該有一個可見的(公共或受保護)無參數構造函數「 」這意味着具有構造函數的實體不受nhibernate支持。 – 2011-03-29 15:17:32

+0

@pijush,它只意味着你不能只有一個非參數的構造函數。只需添加一個無參數構造函數,您就可以輕鬆完成任務。 – Vadim 2011-03-29 15:31:27

11

如果您只想要一組特定的列,請創建一個與列一一對應的類。像這樣:

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

Hi Vadim, 感謝您的回覆。你的意思是說,我每次從整個表格中選擇一些列時,我都會創建一個不同的類。如果是這樣,我的課程將根據選擇增長。 – 2011-03-30 04:05:08

+0

@pijush,這是一個相當普遍的做法,在這裏看到一個很好的討論http://stackoverflow.com/questions/4636769/using-dtos-and-bos – Vadim 2011-03-30 04:13:26

+0

感謝您的幫助..我想我可以繼續前進你的建議。 – 2011-03-30 04:47:38