2010-08-16 9 views
6

हैलो दोस्तों मुझे NamedQuery करते समय सटीक मिलान के साथ कुछ समस्याएं आ रही हैं।जावा: NamedQuery स्ट्रिंग समस्या

मैं वर्तमान में कुछ इस तरह उपयोग कर रहा हूँ:

@NamedQuery(name = MyClass.GET_ENTRY_BY_NAME, query = "select e from Entry e where e.name =:"+ Entry.NAME) 

... 

Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME); 
     query.setParameter(Entry.NAME, myEntry.getName()); 

यह ज्यादातर मामलों के लिए काम करता है, फिर भी मैंने देखा है कि मामले में उपयोगकर्ता अंत में एक स्थान के साथ फ़ाइल नाम गुजरती हैं, namedQuery कि चरित्र पर ध्यान नहीं देता। उदाहरण के लिए:

Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME); 
     query.setParameter(Entry.NAME, myEntry.getName()+ " "); 

पहले क्वेरी के समान परिणाम लौटाएगा। मेरी 'मान्य प्रविष्टि' सत्यापन को छोड़कर। दूसरे शब्दों में, मैं क्वेरी को कोई प्रविष्टि वापस करने और बाद में त्रुटि का इलाज करने के लिए चाहता हूं।

एक वैकल्पिक हल मैं, के बारे में सोच सकता है namedQuery में मेरी पैरामीटर आसपास एकल उद्धरण डाल करने के लिए, इस तरह है:

@NamedQuery(name = MyClass.GET_ENTRY_BY_NAME, query = "select e from entry e where e.name =':"+ Entry.NAME "'") 

हालांकि यह मेरे कोड कचरा जाएगा मामले में स्ट्रिंग उस में एकल उद्धरण शामिल हैं ..

कोई विचार विचार लोग?

उत्तर

4

मैं जेपीए में कुछ शोध किया और पता चला कि यह, कुछ स्वत: वर्ण के लिए ट्रिमिंग करता रहा मुझे यकीन नहीं है कि यह स्ट्रिंग्स के साथ समान व्यवहार करता है, लेकिन चूंकि यह मेरे साथ हो रहा है ... मुझे विश्वास है। इसे बाईपास करने का एकमात्र तरीका डेटाबेस डेटाबेस के भीतर कुछ विशेषता सेट करना है (http://www.eclipse.org/eclipselink/api/1.1/org/eclipse/persistence/sessions/DatabaseLogin.html#setShouldTrimStrings देखें)।

वैसे मैं सत्र गुणों के साथ गड़बड़ नहीं करना चाहता था इसलिए मैंने कुछ प्रकार की जांच करने और मेरे कोड में NoResultException कैच के समान अपवाद फेंकने का फैसला किया।

मैं मूल रूप से डेटाबेस से परिणाम ले लिया और स्ट्रिंग मैं प्रयोग किया जाता के साथ क्षेत्र की तुलना में:

query.setParameter(Entry.NAME, myEntry.getName()); 

... 

if(!StringUtils.equals(result.getName(), myEntry.getName()){ 
    do a cool throw just like NoResultException Catch 
} 

मैं भी ट्रिम समारोह axtavt शामिल करने के लिए था! यह सुनिश्चित करने के लिए है कि यदि डेटाबेस में पिछली जगहों वाला कॉलम है और यह उपयोगकर्ता द्वारा दिए गए पैरामीटर से मेल खाता है, तो इसे वैध उत्तर के रूप में शामिल किया जाएगा। उदाहरण के लिए:

डेटाबेस प्रविष्टि: नाम = "फ्लैवियो" - फ़ंक्शन = "फ्लैवियो" के साथ छंटनी।

पैरामीटर पास: नाम = "फ्लैवियो" - जेपीए स्वचालित फ़ंक्शन = "फ्लैवियो" द्वारा ट्रिम किया गया।

यदि यह सब पर यह सिर्फ तुलना जाएगा "फ्लावियो" "फ्लावियो" के साथ छंटनी की नहीं है, NoResult लौटने जब यह है कि एंट्री वापस जाने के लिए चाहिए था।

Nasty वैकल्पिक हल, लेकिन जब तक ऑटो ट्रिमिंग हम सिर्फ बातें की इस तरह के प्रयोग करने का होगा बंद करने के लिए कोई दूसरा रास्ता नहीं है के रूप में।

सभी अन्य उत्तर के लिए धन्यवाद !!

4

मुझे लगता है कि ऐसा इसलिए होता है क्योंकि आपका डेटाबेस फ़ील्ड CHAR(...) के रूप में घोषित किया जाता है, और इसलिए संग्रहित मूल्य सफेद जगहों के साथ गद्देदार होते हैं जिन्हें = ऑपरेशन द्वारा ध्यान में नहीं रखा जाता है।

तो, आप या तो VARCHAR(...) के रूप में अपने डेटाबेस क्षेत्र घोषित या एक अंतर्निहित trim फ़ंक्शन का उपयोग कर सकते हैं:

query = "select e from Entry e where trim(trailing from e.name) =:"+ Entry.NAME 
+0

हाय एक्स्टाव, उत्तर में त्वरितता के लिए धन्यवाद! ठीक है, मेरा डेटाबेस VARCHAR पर सेट है। लेकिन मुझे यकीन नहीं है कि MySQL संस्करण में इस समस्या से कोई लेना देना है या नहीं। मैंने क्वेरी के पैरामीटर को सेट करने से पहले कुछ ट्रिम करने के बारे में भी सोचा था, हालांकि मैं चाहता था कि सॉफ़्टवेयर डेटाबेस से अलग किसी भी चीज़ के लिए त्रुटि लौटाए, यह सुनिश्चित कर रहा है कि उपयोगकर्ता वास्तव में जो भी चाहता है उसे इनपुट कर रहा है। –

+0

@flavio: मैं MySQL से परिचित नहीं हूं, इसलिए इसकी विशेषताओं के बारे में कुछ भी नहीं कह सकता। यह भी ध्यान रखें कि मेरा क्वेरी नमूना संग्रहित मान को ट्रिम करता है, पैरामीटर नहीं, इसलिए परिणाम सटीक होना चाहिए। – axtavt

+0

मैंने क्वेरी बनाने की प्रक्रिया की जांच करने वाले कोड को डीबग किया ... आपके द्वारा प्रदान किए गए कोड के साथ ऐसा लगता है कि समस्या मेरे एसक्यूएल के भीतर है। मैंने देखा कि दोनों पैरामीटर और डेटाबेस प्रविष्टि अलग हैं ... हालांकि कुछ अज्ञात रहस्यमय दिव्य बल के लिए MySQL बस रिक्त स्थान को ट्रिम करता है और इसे बिल्कुल सही मानता है ... अब मुझे लगता है कि यह देखने के लिए मुझे कुछ शोध मिला है कि यह है या नहीं वास्तव में एक MySQL उम्मीद व्यवहार या इसके पीछे कुछ और है। अभी के लिए मुझे लगता है कि मुझे कुछ प्रकार के अतिरिक्त चेक करना होगा। धन्यवाद! –

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