2012-05-24 11 views
7

मैं उस ऑब्जेक्ट पर एक बुलियन संपत्ति द्वारा 'हटाए गए' चिह्नित वस्तुओं को निकालने के लिए Hibernate में @Where एनोटेशन का उपयोग करना चाहता हूं। उदाहरण के लिए निम्नलिखित हाइबरनेट लोड करता है से किसी भी नष्ट कर दिया पते नहीं करना चाहिए:क्या हाइबरनेट को @Where एनोटेशन में बूलियन अक्षरों को दूषित करने से रोकने का कोई तरीका है?

@OneToMany(mappedBy="contact") 
@Where(clause="deleted=FALSE") 
private Set<Address> addresses; 

हालांकि जब मैं deleted=FALSE की तरह एक खंड का उपयोग तो हाइबरनेट एक तालिका नाम है, जो करने के लिए क्वेरी का कारण बनता है के साथ लगाकर द्वारा बूलियन शाब्दिक वध करना होगा असफल। उदाहरण के लिए:

select ... from address address0_ where (address0_.deleted=address0_.FALSE) and address0_.contact_id=? 

मैं क्या उम्मीद (address0_.deleted=FALSE) बजाय (address0_.deleted=address0_.FALSE) की तरह कुछ है।

क्या @Where क्लॉज निर्दिष्ट करने या बूलियन मान को सही ढंग से आउटपुट करने के लिए हाइबरनेट को कॉन्फ़िगर करने का कोई तरीका है?


पीएस।

@Where(clause="deleted='FALSE'") 

(address0_.deleted='FALSE') करने के लिए परिवर्तित हो जाएगी कि जिसमें बस ठीक काम करता है, उदाहरण के लिए, PostgreSQL: ध्यान दें कि यह कुछ डेटाबेस के साथ संभव है एक स्ट्रिंग इस तरह शाब्दिक रूप में बूलियन मान निर्दिष्ट करने के लिए। हालांकि मैं इस परियोजना के लिए एचएसक्यूएलडीबी का उपयोग कर रहा हूं, और एचएसक्यूएलडीबी बुलियन स्ट्रिंग अक्षर का समर्थन नहीं करता है। HSQL पर मैं जब deleted='FALSE' का उपयोग कर निम्न अपवाद प्राप्त करें:

org.hsqldb.HsqlException: data exception: invalid character value for cast

+0

क्या आपको हाइबरनेट सेटअप में एचएसक्यूएलडीबी डायलेक्ट निर्दिष्ट करना याद आया? – Affe

+0

हां, मैं 'org.hibernate.dialect.HSQLDialect' का उपयोग कर रहा हूं और मैंने दोबारा जांच की है कि हाइबरनेट वास्तव में इसका उपयोग कर रहा है। – gutch

उत्तर

5

मैं इस से अधिक छह साल के लिए अनसुलझे किया गया है के बारे में बग रिपोर्ट की खोज की है! हाइबरनेट समस्या ट्रैकर में HHH-1587, HHH-2775 और ANN-647 समस्या पर है।

समाधान एक कस्टम बोली वर्ग जो पंजीकृत करता true, false और कीवर्ड के रूप unknown (इन एसक्यूएल कल्पना में आधिकारिक बूलियन शाब्दिक हैं) तैयार करना है। इससे हाइबरनेट उन्हें कीवर्ड के रूप में पहचानने का कारण बनता है और इस प्रकार उन्हें उपसर्ग करना बंद कर देता है जैसे कि वे कॉलम थे।

यहाँ मेरी कस्टम बोली वर्ग जो मेरे लिए समस्या हल हो गई है:

public class ImprovedHSQLDialect extends HSQLDialect { 

    public ImprovedHSQLDialect() { 
     super(); 
     registerKeyword("true"); 
     registerKeyword("false"); 
     registerKeyword("unknown"); 
    } 
} 

एक बार इस बोली उपयोग में है, @Where(clause="deleted=FALSE") सही ढंग से काम करता है।

1

जब स्तंभ तालिका defintion में बूलियन के रूप में बनाया जाता है, नवीनतम HSQLDB WHERE active = TRUE, WHERE active = 'TRUE' के साथ-साथ WHERE active का समर्थन करता है।

हाइबरनेट एक बीआईटी कॉलम बना सकता है, जिसमें WHERE active = TRUE, WHERE active = B'1' या WHERE active = 1 काम करेगा।

कृपया इन क्षमताओं के लिए संस्करण 2.2.8 या अधिक का उपयोग करें।

+0

क्या आप इसके बारे में निश्चित हैं? मेरे प्रश्न में वर्णित त्रुटि नवीनतम एचएसक्यूएलडीबी (संस्करण 2.2.8) पर हुई।वर्तमान दस्तावेज में http://hsqldb.org/doc/guide/sqlgeneral-chapt.html में स्ट्रिंग-बूलियन रूपांतरण के लिए कोई समर्थन नहीं है, इसलिए मुझे विश्वास नहीं है कि यह HSQLDB की एक विशेषता है। – gutch

+0

दस्तावेज़ सभी संभावित रूपांतरणों को कवर नहीं कर सकते हैं। यदि तालिका में एक बुलेन कॉलम है, तो ऊपर दिए गए सभी काम। हाइबरनेट एक बीआईटी कॉलम बनाना चाहिए, इस मामले में जहां सक्रिय = सही है, जहां सक्रिय = बी'1 'या जहां सक्रिय = 1 काम करेगा। – fredt

+0

उस स्थिति में यह संभव है कि 'कॉलम' एनोटेशन में उचित 'कॉलम परिभाषा' निर्दिष्ट करने से यह काम कर सके। लेकिन जहां तक ​​मेरा संबंध है, हाइबरनेट के लिए 'FALSE' जैसे कॉलम नाम के रूप में आरक्षित शब्द का इलाज करना गलत है, इसलिए मुझे लगता है कि' रजिस्टर कीवर्ड 'विधि का उपयोग करने के लिए यह एक बेहतर समाधान है जैसा कि मैंने अपने उत्तर में वर्णित किया है - यह सरल और तत्काल है इसे सभी हाइबरनेट वस्तुओं में ठीक करता है। – gutch

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

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