Javax.persistence.Query.getResultList () null döndürebilir mi?


115

Ve eğer öyleyse, hangi koşullar altında?

Javadoc ve JPA özellikleri hiçbir şey söylemiyor.


Tam olarak bu soruyu araştırıyordum! tks! 4 sen kadar!
rafa.ferreira

Yanıtlar:


69

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.


29
Bu kesinlikle modası geçmiş, Hibernate boş bir liste döndürür.
Michael Laffargue

2
Hibernate 4.3.10'dan hala boş alıyorum (Spring Data için JPA motoru olarak çalışıyor). Tipik JPA sorguları beklendiği gibi çalıştığından, bu yalnızca tek bir yerel sorgu için olur.
Jacek Prucia

1
OR kullanarak her iki koşulu da kontrol edin. if(rows == null || rows.size == 0){}satırlar getResultList ()
işlevinin

Sadece bir Optional.ofNullable () içine sarın ve hazırsınız.
de.la.ru

nullBoş bir liste yerine geri dönmenin şartnamenin amaçladığı şey olmadığına inanıyorum , aksi takdirde nullbaşka yerlerde ne zaman bekleneceğini oldukça açık hale getiriyor . Özellikle getResultListokumalar 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. nullElbette yine de kontrol eder ve gerekirse boş bir listeyi kendim iade ederdim .
René

23

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.


+1: "Her JPA sağlayıcısına güvenir miydin?" Derken çok haklısın HAYIR :)
dfa

Eklemek için düzenlendi: Arthur, Hibernate'in JPA'sının kayıt bulunmazsa aslında boş döndürdüğüne dikkat çekti. Yani aslında bu durumda, boş ve boş listeyi bir araya getirmemiz gerekiyor. Yukarıda geçtiğimiz düşünce sürecinin hala geçerli olduğuna inanıyorum. Hatta, farklı JPA yığınları için farklı null işlemlerine sahip olmamız gerektiği bile düşünülebilir. Taşınabilirlik eğlencesine hoş geldiniz.
djna

Kabul. JPA spesifikasyonunun yapması gerekeni yapmaması nedeniyle sadece "taşınabilirlik eğlencesi" vardır ... kesin anlamsallığı belirtin. Mahcup çıkarları olan bir komite tarafından yönetilmesi ne yazık.
DataNucleus

2
Olarak ele alınmalıdır "Ben sorgu anlamadı" Exceptiondönen, nullnerede Collectiondönüş türü olduğu bariz bir tasarım kusur
Matoni

13

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.


2
OpenJPA için null yerine boş bir liste de alıyorum.
Gnavvy

3

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.


2
Tam kod parçacığı için teşekkürler. Ancak bu cevap, şartnamenin uygulanmasından biri olan sadece kış uykusuna odaklanmaktadır. OpenJPA gibi diğer uygulamalar davranış açısından farklılık gösterir. Ayrıca, hazırda bekletme, farklı sürümlere göre davranışı değiştirmiş görünüyor.
venky

1

Elbette, sonuç setini Jakarta'nın CollectionUtils.isNotEmpty ile test ederseniz, her iki şekilde de kapsanırsınız.


0

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.


0

Uygulanmasını göz önüne alındığında getResultsList()de org.hibernate.ejb.QueryImplsı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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.