जवाबों:
तुम सही हो। जेपीए विनिर्देश इसके बारे में कुछ नहीं कहता है। लेकिन Hibernate पुस्तक, 2 डी संस्करण के साथ जावा दृढ़ता , कहते हैं:
यदि क्वेरी परिणाम रिक्त है, तो एक नल वापस आ गया है
जब आप कोई परिणाम नहीं के साथ क्वेरी.getResultList () कहते हैं, तो हाइबरनेट JPA कार्यान्वयन (इकाई प्रबंधक) वापस आ जाते हैं।
अपडेट करें
जैसा कि कुछ उपयोगकर्ताओं द्वारा बताया गया है, ऐसा लगता है कि हाइबरनेट का एक नया संस्करण इसके बजाय एक खाली सूची देता है।
एक खाली सूची Eclipselink में लौटा दी जाती है और जब कोई परिणाम नहीं मिलता है।
if(rows == null || rows.size == 0){}
जहाँ पंक्तियाँ मिलती हैं ।ResultList () रिटर्न
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
निश्चित रूप से जाँच करूँगा और यदि आवश्यक हो तो एक खाली सूची स्वयं वापस करूँगा।
यदि ऐनक ने कहा कि ऐसा नहीं हो सकता है, तो क्या आप उन पर विश्वास करेंगे? यह देखते हुए कि आपका कोड अलग-अलग JPA कार्यान्वयनों के विरुद्ध गर्भधारण कर सकता है, क्या आप इसे सही करने के लिए प्रत्येक कार्यान्वयनकर्ता पर भरोसा करेंगे?
कोई फर्क नहीं पड़ता कि, मैं रक्षात्मक रूप से कोड करूंगा और नल के लिए जांच करूंगा।
अब बड़ा सवाल: क्या हमें "अशक्त" और एक खाली सूची को समानार्थक मानना चाहिए? यह वह जगह है जहाँ चश्मा हमें मदद करनी चाहिए, और नहीं।
मेरा अनुमान है कि एक अशक्त रिटर्न (यदि वास्तव में ऐसा हो सकता है) "मैं क्वेरी को समझ नहीं पाया" के बराबर होगा और खाली सूची "हाँ, क्वेरी को समझ लेगी, लेकिन कोई रिकॉर्ड नहीं था"।
आपके पास शायद एक कोड पथ है (एक अपवाद होने की संभावना है) जो कि अनपेक्षित प्रश्नों से संबंधित है, मैं उस रास्ते से नीचे लौटने का निर्देश देना चाहूंगा।
Exception
, रिटर्निंग टाइप में null
कहां Collection
है एक स्पष्ट डिजाइन दोष है
आर्थर के पद के विपरीत, जब मैंने वास्तव में एक क्वेरी चलाई जो कोई भी संस्थाओं से मेल नहीं खाती थी तो मुझे खाली सूची मिली, शून्य नहीं। यह हाइबरनेट का उपयोग कर रहा है और क्या मैं सही व्यवहार पर विचार करता हूं: जब आप संस्थाओं के संग्रह के लिए पूछते हैं तो एक खाली सूची सही उत्तर है और कोई भी नहीं है।
यदि आप org.hibernate.loader.Loader
(4.1) पर करीब से नज़र डालते हैं, तो आप देखेंगे कि सूची हमेशा प्रक्रिया के अंदर आरम्भ की जाती है ।ResultSet () विधि ( डॉक्टर , स्रोत )।
protected List processResultSet(...) throws SQLException {
final List results = new ArrayList();
handleEmptyCollections( queryParameters.getCollectionKeys(), rs, session );
...
return results;
}
इसलिए मुझे नहीं लगता कि यह अब शून्य हो जाएगा।
Query.getResultList()
के बजाय एक खाली सूची देता है null
। इसलिए isEmpty()
लौटे परिणाम में जांच करें , और शेष तर्क के साथ जारी रखें यदि यह गलत है।
के कार्यान्वयन को देखते हुए 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