2010-04-09 11 views
19

मेरे पास समग्र प्राथमिक कुंजी के साथ कुछ एसक्यूएल दृश्य हैं जिन्हें मैं पूछना चाहता हूं, और चूंकि हाइबरनेट इसे समग्र कुंजी के साथ काम करने में दर्द बनाता है, इसलिए मैं createSQLQuery का उपयोग कर रहा हूं। समस्या यह है कि यह विधि केवल एक सूची लौटा सकती है, और मुझे कॉलम को उनके सूचकांक से संदर्भित करने की आवश्यकता है।हाइबरनेट में एसक्यूएल कॉलम नामों का उपयोग करना QQququery परिणाम

कोई भी मौका मैं जेडीबीसी की तरह कुछ कर सकता हूं और कॉलम को उनके एसक्यूएल नाम से उनके सूचकांक के बजाय संदर्भित कर सकता हूं?

उत्तर

46
Query query=session.createSQLQuery("your query"); 
query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE); 
List<Map<String,Object>> aliasToValueMapList=query.list(); 

के सभी लाभ प्राप्त आप कोड से पता लगा सकते हैं के रूप में, सूची मानचित्र वस्तुओं प्रत्येक पंक्ति का प्रतिनिधित्व करने में शामिल है। प्रत्येक मानचित्र ऑब्जेक्ट में कॉलम नाम के रूप में कुंजी और मान के रूप में होगा।

नोट: SQLQuery के लिए यह कार्य, यदि आप उपनाम निर्दिष्ट किए बिना hql क्वेरी पर AliasToEntityMapResultTransformer का उपयोग करते हैं तो आपको सूचकांक मान कुंजी के रूप में प्राप्त होगा।

आप फिर से अपने POJO सूची aliasToValueMapList बदलने रहे हैं, तो मैं आप अपने खुद के ResultTransformer बना सकते हैं और 'transformTuple' विधि से अपने कस्टम वस्तु वापस जाने के लिए सलाह।

+0

बीटीडब्ल्यू, मेरे पास "table1.price के रूप में select1 से ..." के रूप में एक एसक्यूएल क्वेरी है और कुछ कारणों से एलियास टॉन्टीटीमैप रीसेटल्ट ट्रांसफॉर्मर कीमत 1 मैपिंग नहीं कर रहा है। अगर मैं करता हूं "चुनें (तालिका 1।कीमत * 1) से मूल्य 1 के रूप में ... "हालांकि यह काम करता है। इसलिए मुझे लगता है कि मुझे ट्रांसफॉर्मर में एक बग मिला .. – Ricardo

+0

'addScalar' घोषणाओं को जोड़ने के लिए याद रखें (उदाहरण के लिए 'query.addScalar (" myAlias ​​", IntegerType.INSTANCE) ') अन्यथा आपको गलत उपनाम (जैसे ऊपरी मामले में परिवर्तित) या गलत डेटा प्रकार मिल सकते हैं। –

+0

किसी भी तरह मुझे इसे आयात करने के लिए यह आयात जोड़ना होगा: आयात org.hibernate.transform.AliasToEntityMapResultTransformer – ian0411

1

आपका प्रश्न संदिग्ध है - पहले पैराग्राफ में आप इंडेक्स द्वारा कॉलम और दूसरे में, एसक्यूएल नाम से संदर्भित करना चाहते हैं। चूंकि इंडेक्स द्वारा आसान है, मैं नाम से मान लेगा।

सबसे पहले, आप अंतर्निहित JDBC कनेक्शन का उपयोग करने की doWork विधि का उपयोग करें और के रूप में आप शुद्ध JDBC के साथ होता है इसे संभाल कर सकते हैं:

session.doWork(new Work() { 
    public void execute(Connection connection) throws SQLException { 
    connection.prepareStatement(... 
    } 
}); 

या, आप जो कॉलम का String[] रिटर्न query.getReturnAliases उपयोग कर सकते हैं नाम। प्रभावशीलता के लिए, मैं शायद इंडेक्स के लिए उपनाम के Map का निर्माण करूंगा और फिर आप result[map.get("column name")] जैसे कुछ कर सकते हैं।

लेकिन वास्तव में, हाइबरनेट xml मैपिंग का उपयोग करते समय समग्र कुंजी को आसानी से संभालता है (एनोटेशन के साथ प्रयास नहीं किया गया है)। यह थोड़ा और अधिक काम करता है और जटिल संबंधों के साथ कुछ मुद्दे हैं (मुख्य रूप से जब विदेशी कुंजी नाम/स्पैन मेल नहीं खाते हैं), लेकिन एक बार जब आप आईडी क्लास बनाते हैं और इसे मैप करते हैं, तो आप एचक्यूएल/मानदंड के साथ रह सकते हैं और आलसी लोड हो रहा है, सरल मिलती है, गंदे जाँच, आदि

+0

@ ब्रायन, धन्यवाद! हां, मेरा मतलब था नाम से पहुंच, सूचकांक नहीं;) @ एडीआई, हाँ, यही वह जवाब है जो मैं चाहता था, धन्यवाद! – Ricardo

1

विधि ऊपर टिप्पणी में कहा गया है:

query.getReturnAliases() 

वास्तव में मेरे लिए काम नहीं करता है:

Caused by: java.lang.RuntimeException: SQL queries do not currently support returning aliases in query: 
0

मैं एक ही समस्या मिल गया लेकिन इसे हल जब मैं इस क्वेरी क्वेरी = session.createSQLQuery इस्तेमाल किया ("तुम्हारे सवाल"); query.setResultTransformer (AliasToEntityMapResultTransformer.INSTANCE);

मैं हैडर नाम के साथ परिणाम प्राप्त लेकिन मैं जब मैं एसक्यूएल क्वेरी में एक नया स्तंभ का चयन करें Employee.class से Shipmentcolor के रूप में 'DCA5E3' बनाने एक नई समस्या मिल गया लेकिन इस मामले में मैं SHIPMENTCOLOR मिला: 'डी'। शिपमेंटकॉलर का पूरा मूल्य कैसे प्राप्त करें।

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