2011-03-29 29 views
9

Tôi có một thực thể đơn giản gọi là EmployeeEntity với tính ID, Name, Age, Organisation, và Designation. Tôi chỉ truy vấn cơ sở dữ liệu bằng cách sử dụng truy vấnLỗi trong khi chuyển đổi của Nhibernate truy vấn vào danh sách chung

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 

nhưng chuyển đổi sang kiểu của tôi, nó ném một ngoại lệ:

Không thể thực hiện truy vấn [SQL: SQL không có sẵn]

với InnerException:

Giá trị "System.Object []" không thuộc loại "NHiberna teTest.EmployeeEntity "và không thể được sử dụng trong bộ sưu tập chung này. Tên
Parameter: giá trị

dù nó hoạt động tốt sử dụng truy vấn này:

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

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

nhưng tôi không muốn chọn tất cả các cột bởi vì tôi không cần đến chúng.

Trả lời

4

Khi bạn đang truy vấn với select Name, Designation, Age, Organisation..., NHibernate sẽ thực sự trả lại phiên bản IList<object[]>. Để khắc phục điều này, hãy thử viết lại HQL của bạn thành select new EmployeeEntity(Name, Designation, Age, Organisation)... và thêm một hàm tạo thích hợp vào lớp EmployeeEntity.

+0

Hi, cảm ơn bạn đã trả lời nhưng trên constructor thêm và hơn querying..it mang lại cho tôi ngoại lệ này "NHibernate .InvalidProxyTypeException: Các loại sau đây có thể không được sử dụng làm proxy: NHibernateTest.EmployeeEntity: loại phải có hàm tạo đối số không được hiển thị (công khai hoặc được bảo vệ) " có nghĩa là thực thể với hàm tạo không được hỗ trợ bởi nhibernate. –

+0

@pijush, nó chỉ có nghĩa là bạn không thể chỉ có một hàm tạo không tham số. Đơn giản chỉ cần thêm một constructor parameterless và bạn tốt để đi. – Vadim

11

Nếu bạn chỉ muốn một tập hợp các cột nhất định, hãy tạo một lớp ánh xạ từ một đến một cột với các cột của bạn. Cũng giống như vậy:

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

Sau đó, bạn chỉ cần thêm một biến kết quả cho truy vấn của bạn

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, Cảm ơn bạn đã trả lời. Bạn có nghĩa là để nói rằng tôi đã thực hiện một lớp khác nhau mỗi khi tôi đã chọn một vài cột từ toàn bộ bảng. Nếu vậy các lớp của tôi sẽ phát triển theo sự lựa chọn. –

+0

@pijush, đó là một thực tế khá phổ biến, xem ở đây để có một cuộc thảo luận tốt http://stackoverflow.com/questions/4636769/using-dtos-and-bos – Vadim

+0

nhờ sự giúp đỡ .. Tôi nghĩ rằng tôi có thể tiếp tục với suggession của bạn. –

Các vấn đề liên quan