2011-03-29 14 views
9

को Nhibernate क्वेरी के रूपांतरण मैं एक साधारण गुण ID, Name, Age, Organisation, और Designation साथ EmployeeEntity बुलाया इकाई है।के दौरान त्रुटि सामान्य सूची

चलाया नहीं जा सका क्वेरी: मैं बस क्वेरी

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 

लेकिन मेरे प्रकार के रूपांतरण पर का उपयोग कर डेटाबेस से क्वेरी कर रहा हूँ, यह एक अपवाद फेंक रहा है [एसक्यूएल: एसक्यूएल उपलब्ध नहीं]

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[]> उदाहरण वापस कर देगा। इसे दूर करने के लिए, अपने एचक्यूएल को select new EmployeeEntity(Name, Designation, Age, Organisation)... पर पुनः लिखने का प्रयास करें और EmployeeEntity कक्षा में उपयुक्त कन्स्ट्रक्टर जोड़ें।

+0

हाय करने के लिए एक परिणाम के ट्रांसफार्मर जोड़ने की जरूरत है, लेकिन उत्तर के लिए जोड़ने निर्माता पर और से धन्यवाद querying..it मुझे इस अपवाद "NHibernate देता है InvalidProxyTypeException: निम्नलिखित प्रकारों का उपयोग प्रॉक्सी के रूप में नहीं किया जा सकता है: NHibernateTest.EmployeeEntity: प्रकार में एक दृश्यमान (सार्वजनिक या संरक्षित) नो-तर्क कन्स्ट्रक्टर होना चाहिए " जिसका अर्थ है कि कन्स्ट्रक्टर के साथ एक इकाई निबर्ननेट द्वारा समर्थित नहीं है। –

+0

@pijush, इसका मतलब केवल यह है कि आपके पास केवल एक गैर पैरामीटर रहित कन्स्ट्रक्टर नहीं हो सकता है। बस एक पैरामीटर रहित कन्स्ट्रक्टर जोड़ें और आप जाने के लिए अच्छे हैं। – Vadim

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

हाय वादिम, आपके उत्तर के लिए धन्यवाद। क्या आप कहने का मतलब है कि मैंने हर बार एक अलग वर्ग बना दिया है जब मैंने पूरी मेज से कुछ कॉलम का चयन किया है। यदि ऐसा है तो मेरी कक्षाएं चयन के अनुसार बढ़ेगी। –

+0

@ पजुश, यह एक सामान्य आम अभ्यास है, यहां एक अच्छी चर्चा के लिए देखें http://stackoverflow.com/questions/4636769/using-dtos-and-bos – Vadim

+0

सहायता के लिए धन्यवाद .. मुझे लगता है कि मैं आगे बढ़ सकता हूं आपका सुझाव –

संबंधित मुद्दे