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.
+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.
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 ).
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.
Query.getResultList()mengembalikan daftar kosong, bukan null. Jadi periksa isEmpty()hasil yang dikembalikan, dan lanjutkan dengan logika lainnya jika salah.
Mengingat implementasi getResultsList()di org.hibernate.ejb.QueryImplkelas, dimungkinkan untuk mengembalikan null:
publicList getResultList(){try{return query.list();}catch(QueryExecutionRequestException he){thrownewIllegalStateException(he);}catch(TypeMismatchException e ){thrownewIllegalArgumentException(e);}catch(HibernateException he){
em.throwPersistenceException( he );returnnull;}
Jawaban:
Kamu benar. Spesifikasi JPA tidak menjelaskan apa-apa tentang itu. Tapi buku Java Persistence with Hibernate, edisi ke-2 , mengatakan:
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.
sumber
if(rows == null || rows.size == 0){}
di mana baris adalah apa yang dikembalikan getResultList ()null
bukannya daftar kosong bukanlah apa yang dimaksudkan oleh spesifikasi karena sebaliknya membuatnya cukup jelas kapan harus diharapkannull
di tempat lain. Apalagi sebagai dokumentasi untukgetResultList
dibacaExecute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the results
. Saya masih akan memeriksanull
tentu saja dan mengembalikan daftar kosong sendiri jika diperlukan.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.
sumber
Exception
, mengembalikan dinull
manaCollection
dalam jenis pengembalian merupakan cacat desain yang jelasBertentangan 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.
sumber
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 ).Jadi saya tidak berpikir itu akan mengembalikan nol sekarang.
sumber
Tentu saja, jika Anda menguji set hasil dengan CollectionUtils.isNotEmpty Jakarta, Anda akan tercakup.
sumber
Query.getResultList()
mengembalikan daftar kosong, bukannull
. Jadi periksaisEmpty()
hasil yang dikembalikan, dan lanjutkan dengan logika lainnya jika salah.sumber
Mengingat implementasi
getResultsList()
diorg.hibernate.ejb.QueryImpl
kelas, dimungkinkan untuk mengembalikannull
:Versi hibernasi saya adalah: 3.3.1.GA
sumber