2011-11-15 5 views
32

के लिए कोई इकाई नहीं मिली इस प्रश्न को पोस्ट करने से पहले, मैंने पहले से ही this देखा, लेकिन मैं जो भी ढूंढ रहा था उसे प्राप्त नहीं कर सका।javax.persistence.NoResultException: क्वेरी

मुझे पता है कि मैंने जो प्रश्न लिखा है, उसके लिए केवल एक पंक्ति या कोई भी मौजूद नहीं हो सकता है। तो, मेरे पास getResultList() का उपयोग करने का कोई कारण नहीं है।

यहाँ मेरी कोड है:

String hql="from DrawUnusedBalance where unusedBalanceDate= :today"; 
Query query=em.createQuery(hql); 
query.setParameter("today",new LocalDate()); 

DrawUnusedBalance drawUnusedBalance= 
    (DrawUnusedBalance)query.getSingleResult();// we can have only a 
               // single datum per day 
//`System.out.println(drawUnusedBalance.toString());` 

समस्या है, अगर वहाँ कोई पंक्ति है, यह एक अपवाद फेंकता है, और यदि नहीं यह ठीक काम करता है। मुझे समस्या पता है लेकिन मैं भी सबसे अच्छा समाधान ढूंढ रहा हूं।

मैं क्या चाहता था, अगर डीबी में कोई पंक्ति नहीं है, तो मैं एक शून्य वस्तु (अपवाद प्राप्त करने के बजाय) प्राप्त करना चाहता था, इसलिए यदि मैं शून्य नहीं हूं, तो मैं एक नया डेटा डालूंगा, मैं बस अपडेट करना चाहता हूं यह।

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

उत्तर

60

हां। आपको try/catch ब्लॉक का उपयोग करने की आवश्यकता है, लेकिन Exception को पकड़ने की कोई आवश्यकता नहीं है। API के अनुसार यह NoResultException फेंक देगा यदि कोई परिणाम न हो, और यह आप पर निर्भर करता है कि आप इसे कैसे संभालना चाहते हैं।

DrawUnusedBalance drawUnusedBalance = null; 
try{ 
drawUnusedBalance = (DrawUnusedBalance)query.getSingleResult() 
catch (NoResultException nre){ 
//Ignore this because as per your logic this is ok! 
} 

if(drawUnusedBalance == null){ 
//Do your logic.. 
} 
+0

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

+1

मुझे लगता है कि ** चेक अपवाद ** को पकड़ने और वैकल्पिक पथ लेने में कुछ भी गलत नहीं है। यही कारण है कि जेपीए आपको यह विकल्प दे रहा है कि आप इसे कैसे संभालना चाहते हैं। असल में जिस विधि को आप ढूंढ रहे हैं वह [हाइबरनेट] (http://docs.jboss.org/hibernate/core/3.2/api/org/hibernate/Query.html#uniqueResult()) में उपलब्ध है जो जेपीए के साथ उपलब्ध नहीं है । – ManuPK

+0

@ user1017111 मुझे ** पकड़ ** के अंदर कोड लिखने में आपकी समस्या मिली। मैंने कोड को पठनीय बनाने के लिए थोड़ा जवाब दिया है। – ManuPK

6

आप के बाद से आप नहीं जानते कि एक UniqueResult (इसलिए अपवाद) आप सूची का उपयोग करें और आकार की जांच कर सकता है कि वहाँ, क्वेरी से परिणाम सूची प्राप्त करने का उल्लेख किया?

if (query.list().size() == 1) 

चूंकि आप एक नहीं कर रहे हैं() अपने अद्वितीय वस्तु प्राप्त करने के लिए एक प्रश्न निष्पादित किया जाएगा कि क्या आप uniqueResult या सूची कहते हैं।

+0

अभी के लिए, मैं query.list()। IsEmpty() का उपयोग कर रहा हूं यह देखने के लिए कि क्या कोई डेटा लौटाया गया है ... मैंने सोचा कि प्रोग्रामर के लिए यह आसान होगा अगर हमें एक नल ऑब्जेक्ट मिल रहा है जैसे कि get() विधि । धन्यवाद – WowBow

+0

कोई समस्या नहीं है। यह स्पष्ट रूप से था जब मैंने अपना जवाब लिखा था;) –

+0

.. मुझे वह मिला। कभी-कभी इसका वैकल्पिक तरीका – WowBow

2

जब आप नहीं जानते कि कोई परिणाम हैं या नहीं, तो getResultList() का उपयोग करें।

List<User> foundUsers = (List<User>) query.getResultList(); 
     if (foundUsers == null || foundUsers.isEmpty()) { 
      return false; 
     } 
User foundUser = foundUsers.get(0); 
+0

कृपया बताएं कि कोड प्रश्न का उत्तर कैसे देता है। – jxh

+0

ठीक है, यह एक उत्तर के बजाय एक सुझाव है। लेकिन दूसरों के लिए उपयोगी हो सकता है। – ACV

+0

जब आप किसी भी परिणाम देखते हैं कि क्या पता नहीं है, getResultList का उपयोग()। 'सूची foundUsers = (सूची ) query.getResultList(); अगर (foundUsers == बातिल || foundUsers.isEmpty()) {अवास्तविक लौटाते ; } उपयोगकर्ता foundUser = foundUsers.get (0); ' – ACV

5

जावा 8 का उपयोग करते समय, आप धारा एपीआई का लाभ सभी ले और

return (YourEntityClass) entityManager.createQuery() 
.... 
.getResultList() 
.stream().findFirst(); 

करने के लिए कोड को आसान बनाने में आप अशक्त बजाय पसंद करते हैं यही कारण है कि आप java.util.Optional

दे देंगे हो सकता है, आपको

... 
.getResultList() 
.stream().findFirst().orElse(null); 
संबंधित मुद्दे