2008-09-17 14 views
18

इसे छोटा करने के लिए: हाइबरनेट उदाहरण के द्वारा अनुमान और क्वेरी का समर्थन नहीं करता है?उदाहरण और अनुमानों द्वारा हाइबरनेट क्वेरी

कोड यह है:: मैं इस पोस्ट पाया

User usr = new User(); 
usr.setCity = 'TEST'; 
getCurrentSession().createCriteria(User.class) 
.setProjection(Projections.distinct(Projections.projectionList() 
.add(Projections.property("name"), "name") 
.add(Projections.property("city"), "city"))) 
.add(Example.create(usr)) 

अन्य पोस्टर की तरह कहा, उत्पन्न एसक्यूएल एक जहां वर्ग जिक्र होने रहता है के लिए सिर्फ y0_ =? इस_.city के बजाय।

मैंने पहले से ही कई दृष्टिकोणों की कोशिश की है, और समस्या ट्रैकर की खोज की लेकिन इसके बारे में कुछ भी नहीं मिला।

मैं भी प्रोजेक्शन उर्फ ​​और ट्रांसफॉर्मर उपयोग करने के लिए कोशिश की, लेकिन यह काम नहीं करता:

User usr = new User(); 
usr.setCity = 'TEST'; 
getCurrentSession().createCriteria(User.class) 
.setProjection(Projections.distinct(Projections.projectionList() 
.add(Projections.property("name"), "name") 
.add(Projections.property("city"), "city"))) 
.add(Example.create(usr)).setResultTransformer(Transformers.aliasToBean(User.class)); 

किसी को भी इस्तेमाल किया गया है उदाहरण के द्वारा अनुमानों और क्वेरी?

+0

क्या आप पूर्ण जेनरेट एसक्यूएल दिखा सकते हैं? –

+0

मैंने एक समाधान जोड़ा जिसमें SQL उत्पन्न होती है जब मुझे एक ही समस्या होती है। –

उत्तर

15

क्या मैं आपकी उपयोगकर्ता कक्षा देख सकता हूं? यह सिर्फ नीचे प्रतिबंधों का उपयोग कर रहा है। मुझे नहीं लगता कि प्रतिबंध वास्तव में उदाहरणों से अलग क्यों होंगे (मुझे लगता है कि शून्य क्षेत्रों को उदाहरणों में डिफ़ॉल्ट रूप से अनदेखा किया जाता है)।

getCurrentSession().createCriteria(User.class) 
.setProjection(Projections.distinct(Projections.projectionList() 
.add(Projections.property("name"), "name") 
.add(Projections.property("city"), "city"))) 
.add(Restrictions.eq("city", "TEST"))) 
.setResultTransformer(Transformers.aliasToBean(User.class)) 
.list(); 

मैंने कभी भी alaistToBean का उपयोग नहीं किया है, लेकिन मैंने बस इसके बारे में पढ़ा है। तुम भी बस परिणामों पर पाश सकता है ..

List<Object> rows = criteria.list(); 
for(Object r: rows){ 
    Object[] row = (Object[]) r; 
    Type t = ((<Type>) row[0]); 
} 

आप आप के लिए है, तो मैन्युअल रूप से अपने आप को पॉप्युलेट कर सकते हैं कि जिस तरह से उपयोगकर्ता।

इस मुद्दे का निदान करने के लिए कुछ और जानकारी के बिना इस मुद्दे को देखना मुश्किल है।

43

समस्या तब होती है जब आपके पास उपनाम वस्तु गुण के समान नाम होता है। हाइबरनेट उपनाम उठाता है और इसे एसक्यूएल में उपयोग करता है। मुझे यह here और here दस्तावेज मिला, और मुझे लगता है कि यह हाइबरनेट में एक बग है, हालांकि मुझे यकीन नहीं है कि हाइबरनेट टीम सहमत है।

किसी भी तरह से, मुझे अपने मामले में उन कार्यों के आसपास एक साधारण काम मिल गया है। आपकी माइलेज भिन्न हो सकती है। विवरण नीचे हैं, मैं तो मैं किसी भी त्रुटि या टाइपो के लिए माफी माँगता हूँ इस नमूने के लिए कोड को आसान बनाने की कोशिश की:

select 
    this_.SECTION_HEADER as y1_, 
    this_.SUB_SECTION_HEADER as y2_, 
    this_.SECTION_NUMBER as y3_, 
from 
    MY_TABLE this_ 
where 
    (lower(y1_) like ?) 

कौन सा एक त्रुटि पैदा कर रहा था:

Criteria criteria = session.createCriteria(MyClass.class) 
    .setProjection(Projections.projectionList() 
     .add(Projections.property("sectionHeader"), "sectionHeader") 
     .add(Projections.property("subSectionHeader"), "subSectionHeader") 
     .add(Projections.property("sectionNumber"), "sectionNumber")) 
    .add(Restrictions.ilike("sectionHeader", sectionHeaderVar)) // <- Problem! 
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class)); 

इस एसक्यूएल उत्पादन होगा जावा .sql.SQLException: ORA-00904: "Y1_": अमान्य पहचानकर्ता

लेकिन, जब मैं अपने प्रतिबंध को बदला उपयोग करने के लिए "इस", इसलिए जैसे:

Criteria criteria = session.createCriteria(MyClass.class) 
    .setProjection(Projections.projectionList() 
     .add(Projections.property("sectionHeader"), "sectionHeader") 
     .add(Projections.property("subSectionHeader"), "subSectionHeader") 
     .add(Projections.property("sectionNumber"), "sectionNumber")) 
    .add(Restrictions.ilike("this.sectionHeader", sectionHeaderVar)) // <- Problem Solved! 
    .setResultTransformer(Transformers.aliasToBean(MyDTO.class)); 

यह निम्नलिखित एसक्यूएल का उत्पादन किया और मेरी समस्या हल हो गई।

select 
    this_.SECTION_HEADER as y1_, 
    this_.SUB_SECTION_HEADER as y2_, 
    this_.SECTION_NUMBER as y3_, 
from 
    MY_TABLE this_ 
where 
    (lower(this_.SECTION_HEADER) like ?) 

Thats, it! एक दर्दनाक समस्या के लिए एक बहुत ही सरल तय। मुझे नहीं पता कि यह समस्या उदाहरण के लिए क्वेरी में कैसे अनुवाद करेगी, लेकिन यह आपको करीब ले सकती है।

+2

पॉल: मुझे खुशी है कि इससे मदद मिली। मुझे आश्चर्य हुआ है कि यह जवाब इतने लंबे समय तक अनजान हो गया है क्योंकि यह एक बड़ी समस्या प्रतीत होता है और यह समाधान सहज या दस्तावेज नहीं है। –

+0

संबंधित हाइबरनेट बग https://hibernate.onjira.com/browse/HHH-817 है और इसे हाइबरनेट के संस्करण 3.6.0 बीटा 4 में तय किया गया है। – FGreg

+0

@RyanCook हाय! यह समाधान काम करता है, लेकिन मैं सोच रहा था कि उदाहरणों के साथ कोई कामकाज हुआ है, क्योंकि हमारे पास 10 फ़िल्टर (यानी 10 प्रतिबंध) हो सकते हैं और यदि फ़ील्ड शून्य या खाली है तो हमें प्रत्येक के लिए सत्यापित करना होगा)। – Tarek

0

मुझे एक ही समस्या का सामना करना पड़ रहा है। मैं उदाहरण के द्वारा क्वेरी का उपयोग कर रहा हूं और मैं परिणामों को कस्टम फ़ील्ड द्वारा सॉर्ट करना चाहता हूं। एसक्यूएल में मैं कुछ ऐसा करूंगा:

select pageNo, abs(pageNo - 434) as diff 
from relA 
where year = 2009 
order by diff 

यह ऑर्डर-बाय-क्लॉज के बिना ठीक काम करता है। क्या मुझे मिल गया

Criteria crit = getSession().createCriteria(Entity.class); 
crit.add(exampleObject); 
ProjectionList pl = Projections.projectionList(); 
pl.add(Projections.property("id")); 
pl.add(Projections.sqlProjection("abs(`pageNo`-"+pageNo+") as diff", new String[] {"diff"}, types)); 
crit.setProjection(pl); 

है लेकिन जब मैं

crit.addOrder(Order.asc("diff")); 

जोड़ने मैं एक org.hibernate.QueryException मिलती है: संपत्ति हल नहीं कर सका: अपवाद Diff। के साथ वर्कअराउंड यह या तो काम नहीं करता है।

पुनश्च: के रूप में मैं हाइबरनेट के लिए QBE के उपयोग पर किसी भी विस्तृत प्रलेखन नहीं मिल सकता है, इसके बाद के संस्करण सब सामान मुख्य रूप से परीक्षण और त्रुटि दृष्टिकोण है

6

वास्तविक समस्या यहाँ वहाँ हाइबरनेट में एक बग है कि है जहां यह जहां-खंड में चयन सूची उपनाम का उपयोग करने:

http://opensource.atlassian.com/projects/hibernate/browse/HHH-817

शायद ज़रुरत पड़े किसी को यहाँ जवाब की तलाश में भूमि, टिकट पर देखने चलते हैं। इसे ठीक करने में 5 साल लग गए लेकिन सिद्धांत रूप में यह अगले रिलीज में से एक में होगा और फिर मुझे संदेह है कि आपका मुद्दा दूर हो जाएगा।

-1

मुझे वास्तव में ऐसा नहीं लगता है, जो मुझे मिल सकता है वह शब्द "यह" है। हाइबरनेट को इसकी क्वेरी में कोई प्रतिबंध शामिल नहीं करने का कारण बनता है, जिसका अर्थ है कि इसे सभी रिकॉर्ड सूचियां मिलती हैं। रिपोर्ट की गई हाइबरनेट बग के बारे में, मैं इसे निश्चित रूप से रिपोर्ट के रूप में देख सकता हूं लेकिन मैं पैच डाउनलोड करने में पूरी तरह असफल रहा।

0
ProjectionList pl = Projections.projectionList(); 
pl.add(Projections.property("id")); 
pl.add(Projections.sqlProjection("abs(`pageNo`-" + pageNo + ") as diff", new String[] {"diff"}, types), diff); ---- solution 
crit.addOrder(Order.asc("diff")); 
crit.setProjection(pl); 
+0

एसक्यूएलप्रोजेक्शन के बाद एलियास जोड़ें, जिसका उपयोग ऑर्डरिंग में किया जाएगा – singh

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