क्या javax.persistence.Query.getResultList () शून्य हो सकता है?


115

और यदि हां, तो किन परिस्थितियों में?

जवादोक और जेपीए की युक्ति कुछ भी नहीं कहती है।


मैं इस प्रश्न को ठीक से खोज रहा था! टी.के.एस! अप 4 आप!
rafa.ferreira

जवाबों:


69

तुम सही हो। जेपीए विनिर्देश इसके बारे में कुछ नहीं कहता है। लेकिन Hibernate पुस्तक, 2 डी संस्करण के साथ जावा दृढ़ता , कहते हैं:

यदि क्वेरी परिणाम रिक्त है, तो एक नल वापस आ गया है

जब आप कोई परिणाम नहीं के साथ क्वेरी.getResultList () कहते हैं, तो हाइबरनेट JPA कार्यान्वयन (इकाई प्रबंधक) वापस आ जाते हैं।

अपडेट करें

जैसा कि कुछ उपयोगकर्ताओं द्वारा बताया गया है, ऐसा लगता है कि हाइबरनेट का एक नया संस्करण इसके बजाय एक खाली सूची देता है।

एक खाली सूची Eclipselink में लौटा दी जाती है और जब कोई परिणाम नहीं मिलता है।


29
यह निश्चित रूप से पुराना है, हाइबरनेट एक खाली सूची देता है।
माइकल लाफार्ग

2
मुझे अभी भी हाइबरनेट 4.3.10 से शून्य मिलता है (स्प्रिंग डेटा के लिए जेपीए इंजन के रूप में चल रहा है)। यह केवल एकल मूल क्वेरी के लिए होता है, क्योंकि सामान्य JPA क्वेरीज़ अपेक्षित रूप से काम करती हैं।
जसक प्रूशिया

1
OR का उपयोग करते हुए दोनों स्थितियों की जांच करें। if(rows == null || rows.size == 0){}जहाँ पंक्तियाँ मिलती हैं ।ResultList () रिटर्न
नंबर 945

बस इसे एक Optional.ofNullable () में लपेटें और आप सेट हैं।
de.la.ru

मेरा मानना ​​है कि nullखाली सूची के बजाय वापस लौटना वह नहीं है जो कल्पना से अभिप्रेरित है क्योंकि यह अन्यथा स्पष्ट है जब nullअन्य स्थानों पर उम्मीद की जाती है। खासतौर पर डॉक्यूमेंट को getResultListरीड करने के लिए Execute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the results। मैं अभी भी nullनिश्चित रूप से जाँच करूँगा और यदि आवश्यक हो तो एक खाली सूची स्वयं वापस करूँगा।
रेने

23

यदि ऐनक ने कहा कि ऐसा नहीं हो सकता है, तो क्या आप उन पर विश्वास करेंगे? यह देखते हुए कि आपका कोड अलग-अलग JPA कार्यान्वयनों के विरुद्ध गर्भधारण कर सकता है, क्या आप इसे सही करने के लिए प्रत्येक कार्यान्वयनकर्ता पर भरोसा करेंगे?

कोई फर्क नहीं पड़ता कि, मैं रक्षात्मक रूप से कोड करूंगा और नल के लिए जांच करूंगा।

अब बड़ा सवाल: क्या हमें "अशक्त" और एक खाली सूची को समानार्थक मानना ​​चाहिए? यह वह जगह है जहाँ चश्मा हमें मदद करनी चाहिए, और नहीं।

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

आपके पास शायद एक कोड पथ है (एक अपवाद होने की संभावना है) जो कि अनपेक्षित प्रश्नों से संबंधित है, मैं उस रास्ते से नीचे लौटने का निर्देश देना चाहूंगा।


+1 आप यह कहते हुए सही हैं: "क्या आप प्रत्येक JPA प्रदाता पर भरोसा करेंगे?" NO :)
dfa

जोड़ने के लिए: आर्थर ने कहा है कि हाइबरनेट का जेपीए वास्तव में अशक्त है अगर कोई रिकॉर्ड नहीं मिलता है। तो वास्तव में इस मामले में, हमें एक साथ अशक्त और खाली सूची को मोड़ने की आवश्यकता है। मेरा मानना ​​है कि जिस विचार प्रक्रिया से हम ऊपर गए, वह अभी भी मान्य है। यह भी बोधगम्य है कि हमें अलग-अलग जेपीए स्टैक के लिए अशक्त उपचार करना चाहिए। पोर्टेबिलिटी मज़ा में आपका स्वागत है।
djna

माना। वहाँ केवल "पोर्टेबिलिटी मज़ा" मौजूद है जेपीए की कल्पना के कारण कि यह क्या करना चाहिए ... सटीक शब्दार्थ निर्दिष्ट करें। शर्म करो यह निहित स्वार्थों के साथ समिति द्वारा चलाया जाता है।
DataNucleus

2
"मुझे समझ में नहीं आया" के रूप में संभाला जाना चाहिए Exception, रिटर्निंग टाइप में nullकहां Collectionहै एक स्पष्ट डिजाइन दोष है
मैटोनी

13

आर्थर के पद के विपरीत, जब मैंने वास्तव में एक क्वेरी चलाई जो कोई भी संस्थाओं से मेल नहीं खाती थी तो मुझे खाली सूची मिली, शून्य नहीं। यह हाइबरनेट का उपयोग कर रहा है और क्या मैं सही व्यवहार पर विचार करता हूं: जब आप संस्थाओं के संग्रह के लिए पूछते हैं तो एक खाली सूची सही उत्तर है और कोई भी नहीं है।


2
OpenJPA के लिए, मुझे अशक्त के बजाय एक खाली सूची मिलती है।
ज्ञानवी

3

यदि आप org.hibernate.loader.Loader(4.1) पर करीब से नज़र डालते हैं, तो आप देखेंगे कि सूची हमेशा प्रक्रिया के अंदर आरम्भ की जाती है ।ResultSet () विधि ( डॉक्टर , स्रोत )।

protected List processResultSet(...) throws SQLException {
   final List results = new ArrayList();

   handleEmptyCollections( queryParameters.getCollectionKeys(), rs, session );
   ...
   return results;

}

इसलिए मुझे नहीं लगता कि यह अब शून्य हो जाएगा।


2
सटीक कोड स्निपेट के लिए चीयर्स। लेकिन यह जवाब सिर्फ हाइबरनेट पर केंद्रित है जो विनिर्देशन के कार्यान्वयन में से एक है। OpenJPA जैसे अन्य कार्यान्वयन व्यवहार में भिन्न होते हैं। इसके अलावा, हाइबरनेट ने विभिन्न संस्करणों पर व्यवहार को बदल दिया है।
venky

1

बेशक, यदि आप जकार्ता के कलेक्शन यूटिल्स.इसNotEmpty के साथ सेट किए गए परिणाम का परीक्षण करते हैं, तो आप किसी भी तरह से कवर किए जाते हैं।


0

Query.getResultList()के बजाय एक खाली सूची देता है null। इसलिए isEmpty()लौटे परिणाम में जांच करें , और शेष तर्क के साथ जारी रखें यदि यह गलत है।


0

के कार्यान्वयन को देखते हुए getResultsList()में org.hibernate.ejb.QueryImplवर्ग, यह एक वापस जाने के लिए संभव है null:

public List getResultList() {
    try {
        return query.list();
    }
    catch (QueryExecutionRequestException he) {
        throw new IllegalStateException(he);
    }
    catch( TypeMismatchException e ) {
        throw new IllegalArgumentException(e);
    }
    catch (HibernateException he) {
        em.throwPersistenceException( he );
        return null;
    }

मेरा हाइबरनेट संस्करण है: 3.3.1.GA

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.