Yanıtlar:
Haklısın. JPA spesifikasyonu bu konuda hiçbir şey söylemiyor. Ancak Java Persistence with Hibernate kitabı, 2. baskı şunu söylüyor:
Sorgu sonucu boşsa, null döndürülür
Hazırda bekletme JPA uygulamasını (Varlık Yöneticisi) sonuç olmadan query.getResultList () 'i çağırdığınızda null döndürür.
GÜNCELLEME
Bazı kullanıcıların belirttiği gibi, Hibernate'in en yeni sürümünün bunun yerine boş bir liste döndürdüğü görülüyor.
Eclipselink'te sonuç bulunamadığında da boş bir liste döndürülür.
if(rows == null || rows.size == 0){}
satırlar getResultList ()
null
Boş bir liste yerine geri dönmenin şartnamenin amaçladığı şey olmadığına inanıyorum , aksi takdirde null
başka yerlerde ne zaman bekleneceğini oldukça açık hale getiriyor . Özellikle getResultList
okumalar için dokümantasyon olarak Execute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the results
. null
Elbette yine de kontrol eder ve gerekirse boş bir listeyi kendim iade ederdim .
Spesifikasyonlar bunun olamayacağını söyleseydi, onlara inanır mısın? Kodunuzun farklı JPA uygulamalarıyla çalışabileceği düşünüldüğünde, her uygulayıcıya bunu doğru yapacağına güvenir miydiniz?
Ne olursa olsun, savunma amaçlı kod yazardım ve boşluğu kontrol ederdim.
Şimdi büyük soru: "boş" ve boş bir Listeyi eş anlamlı olarak ele almalı mıyız? Spesifikasyonların bize yardım etmesi gereken yer burasıdır ve yardım etmez.
Tahminime göre boş bir dönüş (eğer gerçekten olabiliyorsa) "sorguyu anlamadım" ile eşdeğer olacak ve boş liste "evet, sorguyu anladım, ancak kayıt yoktu".
Belki ayrıştırılamaz sorgularla ilgilenen bir kod yolunuz (muhtemelen bir istisna) vardır, bu yolda boş bir dönüş yönlendirme eğilimindeyim.
Exception
dönen, null
nerede Collection
dönüş türü olduğu bariz bir tasarım kusur
Arthur'un gönderisinin aksine, aslında hiçbir varlığın eşleşmediği bir sorgu çalıştırdığımda boş bir liste aldım, boş değil. Bu, Hazırda Bekletme kullanıyor ve doğru davranış olarak gördüğüm şey: boş bir liste, bir varlık koleksiyonu talep ettiğinizde doğru yanıttır ve hiç yoktur.
org.hibernate.loader.Loader
(4.1) 'e yakından bakarsanız , listenin her zaman processResultSet () yöntemi ( doc , source ) içinde başlatıldığını göreceksiniz .
protected List processResultSet(...) throws SQLException {
final List results = new ArrayList();
handleEmptyCollections( queryParameters.getCollectionKeys(), rs, session );
...
return results;
}
Bu yüzden şimdi boş döneceğini sanmıyorum.
Elbette, sonuç setini Jakarta'nın CollectionUtils.isNotEmpty ile test ederseniz, her iki şekilde de kapsanırsınız.
Query.getResultList()
yerine boş bir liste döndürür null
. Bu nedenle isEmpty()
, döndürülen sonucu kontrol edin ve yanlışsa mantığın geri kalanıyla devam edin.
Uygulanmasını göz önüne alındığında getResultsList()
de org.hibernate.ejb.QueryImpl
sınıfın, bir iade etmek mümkündür 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;
}
Hazırda bekletme sürümüm: 3.3.1.GA