Jawaban:
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.
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 diharapkan null
di tempat lain. Apalagi sebagai dokumentasi untuk getResultList
dibaca 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 null
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.
Exception
, mengembalikan di null
mana Collection
dalam jenis pengembalian merupakan cacat desain yang jelas
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.
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.
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.QueryImpl
kelas, 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