Bisakah javax.persistence.Query.getResultList () mengembalikan null?

115

Dan jika ya, dalam keadaan apa?

Spesifikasi Javadoc dan JPA tidak mengatakan apa-apa.

rdk
sumber
Saya sedang mencari pertanyaan ini dengan tepat! tks! up 4 kamu!
rafa.ferreira

Jawaban:

69

Kamu benar. Spesifikasi JPA tidak menjelaskan apa-apa tentang itu. Tapi buku Java Persistence with Hibernate, edisi ke-2 , mengatakan:

Jika hasil query kosong, null dikembalikan

Implementasi Hibernate JPA (Entity Manager) mengembalikan null saat Anda memanggil query.getResultList () tanpa hasil.

MEMPERBARUI

Seperti yang ditunjukkan oleh beberapa pengguna, tampaknya versi Hibernate terbaru mengembalikan daftar kosong.

Daftar kosong dikembalikan di Eclipselink juga saat tidak ada hasil yang ditemukan.

Arthur Ronald
sumber
29
Ini sudah pasti ketinggalan zaman, Hibernate mengembalikan daftar kosong.
Michael Laffargue
2
Saya masih mendapatkan null dari Hibernate 4.3.10 (berjalan sebagai mesin JPA untuk Spring Data). Ini hanya terjadi untuk satu kueri asli, karena kueri JPA biasa berfungsi seperti yang diharapkan.
Jacek Prucia
1
Cukup periksa kedua kondisi menggunakan ATAU. if(rows == null || rows.size == 0){}di mana baris adalah apa yang dikembalikan getResultList ()
Number945
Cukup bungkus dalam Opsional.ofNullable () dan Anda sudah siap.
de.la.ru
Saya percaya mengembalikan nullbukannya daftar kosong bukanlah apa yang dimaksudkan oleh spesifikasi karena sebaliknya membuatnya cukup jelas kapan harus diharapkan nulldi tempat lain. Apalagi sebagai dokumentasi untuk getResultListdibaca Execute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the results. Saya masih akan memeriksa nulltentu saja dan mengembalikan daftar kosong sendiri jika diperlukan.
René
23

Jika spesifikasinya mengatakan itu tidak bisa terjadi, apakah Anda akan percaya mereka? Mengingat bahwa kode Anda dapat dijalankan terhadap implementasi JPA yang berbeda, apakah Anda akan mempercayai setiap pelaksana untuk melakukannya dengan benar?

Tidak peduli apa, saya akan membuat kode defensif dan memeriksa nol.

Sekarang pertanyaan besarnya: haruskah kita memperlakukan "null" dan List kosong sebagai sinonim? Di sinilah spesifikasi seharusnya membantu kami, dan tidak.

Dugaan saya adalah bahwa pengembalian nol (jika memang itu bisa terjadi) akan setara dengan "Saya tidak mengerti kueri" dan daftar kosong akan menjadi "ya, mengerti kueri, tetapi tidak ada catatan".

Anda mungkin memiliki jalur kode (kemungkinan pengecualian) yang berhubungan dengan kueri yang tidak dapat diuraikan, saya cenderung mengarahkan pengembalian nol ke jalur itu.

djna
sumber
+1 Anda benar ketika mengatakan: "apakah Anda mempercayai setiap penyedia JPA?" TIDAK :)
dfa
Diedit untuk menambahkan: Arthur telah menunjukkan bahwa JPA Hibernate sebenarnya mengembalikan nol jika tidak ada catatan yang ditemukan. Jadi sebenarnya dalam kasus ini, kita perlu melipat daftar null dan daftar kosong. Saya yakin bahwa proses berpikir yang kami lalui di atas masih berlaku. Bahkan dapat dibayangkan bahwa kita harus memiliki perlakuan null yang berbeda untuk tumpukan JPA yang berbeda. Selamat datang di kesenangan portabilitas.
djna
Sepakat. Hanya ada "kesenangan portabilitas" karena spesifikasi JPA tidak melakukan apa yang seharusnya dilakukan ... menentukan semantik yang tepat. Malu itu dijalankan oleh komite dengan kepentingan pribadi.
DataNucleus
2
"Saya tidak mengerti kueri" harus ditangani karena Exception, mengembalikan di nullmana Collectiondalam jenis pengembalian merupakan cacat desain yang jelas
matoni
13

Bertentangan dengan posting Arthur, ketika saya benar-benar menjalankan kueri yang tidak ada entitas yang cocok, saya mendapat daftar kosong, bukan nol. Ini menggunakan Hibernate dan itulah yang saya anggap sebagai perilaku yang benar: daftar kosong adalah jawaban yang benar ketika Anda meminta kumpulan entitas dan tidak ada.

Andrew Simons
sumber
2
untuk OpenJPA, saya juga mendapatkan daftar kosong, bukan null.
Gnavvy
3

Jika Anda melihat lebih dekat ke org.hibernate.loader.Loader(4.1) Anda akan melihat bahwa daftar selalu diinisialisasi di dalam metode processResultSet () ( doc , source ).

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

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

}

Jadi saya tidak berpikir itu akan mengembalikan nol sekarang.

Charles Follet
sumber
2
Bersulang untuk cuplikan kode yang tepat. Namun jawaban ini hanya fokus pada hibernate yang merupakan salah satu implementasi dari spesifikasi tersebut. Implementasi lain seperti OpenJPA berbeda dalam perilakunya. Selain itu, hibernasi tampaknya telah mengubah perilaku pada versi yang berbeda.
venky
1

Tentu saja, jika Anda menguji set hasil dengan CollectionUtils.isNotEmpty Jakarta, Anda akan tercakup.

Al Scherer
sumber
0

Query.getResultList()mengembalikan daftar kosong, bukan null. Jadi periksa isEmpty()hasil yang dikembalikan, dan lanjutkan dengan logika lainnya jika salah.

Cyril Sojan
sumber
0

Mengingat implementasi getResultsList()di org.hibernate.ejb.QueryImplkelas, dimungkinkan untuk mengembalikan 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;
    }

Versi hibernasi saya adalah: 3.3.1.GA

menipu coyote
sumber