2010-04-10 12 views
9

मैंने उपयोगकर्ता नाम का उपयोग करने के लिए ejb के साथ एक नामांकन बनाया है। जब singleResult रिक्त है, तो मैं निम्न अपवाद प्राप्त करें:javax.persistence.NoResultException: getSingleResult() ने किसी भी संस्था को पुनर्प्राप्त नहीं किया

javax.persistence.NoResultException: getSingleResult() did not retrieve any entities 

लेकिन यह अपवाद परिणाम मैं चाहता हूँ कि जब उपयोगकर्ता नाम नि: शुल्क है।

public User getUserByUsername(String username) throws DAOException{ 
    try{ 
     Query q = em.createNamedQuery(User.getUserByUsername); 
     q.setParameter("username", username); 
     return (User) q.getSingleResult(); 
    }catch(Exception e){ 
     throwException(username, e); 
     return null; 
    } 
} 

किसी को भी पता है कि समस्या क्या है:

यहाँ कोड है। :(

मैं अशक्त वापस जाने के लिए और डॉन 't एक अपवाद प्राप्त करना चाहते हैं।

आपको बहुत बहुत धन्यवाद

+0

नामांकित क्वेरी दिखाएं? – Bozho

उत्तर

27

आप बयान throwException(username, e); साथ अपनी पकड़ ब्लॉक में अपवाद rethrow लगते हैं। यदि आपको लगता है ?

public User getUserByUsernameOrNull(String username) { 
    try{ 
     Query q = em.createNamedQuery(User.getUserByUsername); 
     q.setParameter("username", username); 
     return (User) q.getSingleResult(); 
    } catch(NoResultException e) { 
     return null; 
    } 
} 
+1

सही। आपका बहुत बहुत धन्यवाद। –

0

विधि throwException क्या करता है

: किसी भी बिना किसी अपवाद के उपयोगकर्ता या null प्राप्त करने के लिए इस तरह निम्नलिखित दिखना चाहिए

क्या इसमें कोई अपवाद फेंक दिया गया है लेकिन आप पूर्व अपवाद के संदेश का उपयोग कर रहे हैं?

8

इसके बजाय getResultList का उपयोग करें और जांचें कि List खाली है (शून्य तत्व है)। अन्यथा, सूची में एक तत्व होता है और आप इसे वापस कर देते हैं।

+0

यह पसंदीदा उत्तर होना चाहिए, क्योंकि यह अपवाद हैंडलिंग ब्लॉक से बचाता है, जो इस मामले में, जेपीए क्लाइंट पर फूला हुआ प्रतीत होता है। http://blog.takipi.com/ignore-checked-exceptions-all-the-cool-devs-are-doing-it-based-on-600000-java-projects/ – michaelok

+0

अमरूद के इटेरटेबल वर्ग, विशेष रूप से getFirst विधि, दिखाता है कि कैसे एक असाधारण मामले के लिए अपवाद से बचा जा सकता है: getFirst 'पुनरावर्तनीय या डिफ़ॉल्ट में पहला तत्व देता है यदि अस्थिर खाली है। – michaelok

2

getSingleResult पर कॉल करते समय आप परिभाषित व्यवहार का अनुभव करते हैं और कोई प्रविष्टि नहीं मिली: NoResultException फेंक दिया गया है। आप पकड़-खंड में NoResultException को पकड़ सकते हैं, क्योंकि लेनदेन को रोलबैक के रूप में चिह्नित नहीं किया जाएगा, जब जेपीए NoResultException फेंक रहा है। या आप getResultList() का उपयोग कर सकते हैं और जांच सकते हैं कि आकार बिल्कुल "1" है, इसलिए आप जानते हैं कि आपको अपना उपयोगकर्ता मिला है।

इसके अतिरिक्त, यदि उपयोगकर्ता नहीं मिला है, तो मैं "[null]" वापस नहीं लौटाऊंगा, लेकिन एक चेक किए गए UserNotFoundException (परिभाषित करने के लिए) फेंक दूंगा। लेकिन यह उस विधि के अनुबंध पर निर्भर करता है जिसे आप कार्यान्वित करने जा रहे हैं।

+0

क्या आप इस पर विस्तार कर सकते हैं: "क्योंकि यह रनटाइमसेप्शन" पकड़ अपवाद "फिट नहीं होगा" .. क्यों नहीं? –

2

माइकल ने कहा: "आप पकड़-खंड में NoResultException पकड़ सकते हैं, क्योंकि लेनदेन रोलबैक के रूप में चिह्नित नहीं किया जाएगा, जब जेपीए NoResultException फेंक रहा है।" ऐसा लगता है कि कुछ जेपीए कार्यान्वयन के लिए, NoResultException लेन-देन है, जो जेपीए विनिर्देश का उल्लंघन करती है, इस लेख के अनुसार rollbak देगा: कोशिश पकड़ ब्लॉक में NoResultException marks transaction rollback

+1

आप सही हैं, यह ग्लासफ़िश 4.0 में होता है – Roland

0

पकड़ने NoResultException और इस तरह के एक शून्य मान लौटने के रूप में अपने आवश्यकता के अनुसार इसे संभाल। कोशिश पकड़ने का

उदाहरण नीचे दिए गए लिंक में विस्तृत है: http://www.javabrahman.com/j2ee/jpa/no-result-exception/

0

आपके आवेदन स्प्रिंग रू सबसे मतदान जवाब का उपयोग करता है काम नहीं करता है: अपवाद पहलुओं द्वारा पकड़ा जाता है और आप कभी नहीं वांछित हो NoResultException। समस्या को हल करने का एकमात्र तरीका getResultList का उपयोग करना और परिणामी List में शून्य, एक या अधिक परिणामों की जांच करना है, जैसा कि दूसरे सबसे अधिक वोट दिए गए उत्तर में बताया गया है।

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

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