Misalnya saya punya pertanyaan seperti itu:
Query q = sess.createQuery("from Cat cat");
List cats = q.list();
Jika saya mencoba membuat sesuatu seperti ini, itu menunjukkan peringatan berikut
Type safety: The expression of type List needs unchecked conversion to conform to List<Cat>
List<Cat> cats = q.list();
Apakah ada cara untuk menghindarinya?
sess.createQuery("from Cat cat", Cat.class);
seperti yang disebutkan Elazar.Jawaban:
Menggunakan di
@SuppressWarnings
mana-mana, seperti yang disarankan, adalah cara yang baik untuk melakukannya, meskipun ini melibatkan sedikit ketikan jari setiap kali Anda meneleponq.list()
.Ada dua teknik lain yang saya sarankan:
Menulis pembantu pemeran
Cukup refactor semua Anda
@SuppressWarnings
menjadi satu tempat:Mencegah Eclipse membuat peringatan untuk masalah yang tidak terhindarkan
Di Eclipse, buka Window> Preferences> Java> Compiler> Errors / Warnings dan di bawah Generic type, pilih kotak centang
Ignore unavoidable generic type problems due to raw APIs
Ini akan mematikan peringatan yang tidak perlu untuk masalah serupa seperti yang dijelaskan di atas yang tidak dapat dihindari.
Beberapa komentar:
Query
bukan hasilq.list()
karena dengan cara itu metode "curang" ini hanya dapat digunakan untuk menipu dengan Hibernate, dan bukan untuk curangList
secara umum..iterate()
dll.sumber
Collections.checkedList()
metode tidak akan menekan peringatan tugas yang tidak dicentang.Sudah lama sejak pertanyaan itu diajukan, tetapi saya harap jawaban saya dapat membantu orang seperti saya.
Jika Anda melihat dokumen javax.persistence api , Anda akan melihat bahwa beberapa metode baru telah ditambahkan di sana sejak itu
Java Persistence 2.0
. Salah satunya adalahcreateQuery(String, Class<T>)
yang kembaliTypedQuery<T>
. Anda dapat menggunakanTypedQuery
seperti yang Anda lakukan denganQuery
perbedaan kecil bahwa semua operasi dikategorikan aman sekarang.Jadi, ubah saja kode Anda menjadi seperti ini:
Dan Anda sudah siap.
sumber
Kami juga menggunakan
@SuppressWarnings("unchecked")
, tetapi kami paling sering mencoba menggunakannya hanya pada deklarasi variabel, bukan pada metode secara keseluruhan:sumber
Coba gunakan,
TypedQuery
bukanQuery
. Sebagai contoh, bukan ini: -Gunakan ini:-
sumber
Criteria
?Dalam kode kami, kami menganotasi metode pemanggilan dengan:
@Suppressings ("tidak ada")
Saya tahu ini tampak seperti peretasan, tetapi rekan pengembang baru-baru ini memeriksa dan menemukan hanya itu yang dapat kami lakukan.
sumber
Rupanya, metode Query.list () dalam Hibernate API bukan tipe aman "menurut desain", dan tidak ada rencana untuk mengubahnya .
Saya yakin solusi paling sederhana untuk menghindari peringatan compiler adalah dengan menambahkan @SuppressWarnings ("unchecked"). Anotasi ini dapat ditempatkan di tingkat metode atau, jika di dalam metode, tepat sebelum deklarasi variabel.
Jika Anda memiliki metode yang merangkum Query.list () dan mengembalikan List (atau Collection), Anda juga mendapatkan peringatan. Tapi yang ini ditekan menggunakan @SuppressWarnings ("rawtypes").
Metode listAndCast (Query) yang diusulkan oleh Matt Quail kurang fleksibel dibandingkan Query.list (). Sementara saya bisa melakukan:
Jika saya coba kode di bawah ini:
Saya akan mendapatkan kesalahan kompilasi: Type mismatch: can't convert from List to ArrayList
sumber
Ini bukan kekeliruan atau kesalahan. Peringatan tersebut mencerminkan masalah mendasar yang sebenarnya - tidak mungkin compiler java benar-benar yakin bahwa kelas hibernate akan melakukan tugasnya dengan benar dan bahwa daftar yang dikembalikan hanya akan berisi Cats. Semua saran di sini baik-baik saja.
sumber
Tidak, tetapi Anda dapat mengisolasinya ke dalam metode kueri tertentu dan menyembunyikan peringatan dengan
@SuppressWarnings("unchecked")
anotasi.sumber
Versi Hibernate yang lebih baru sekarang mendukung jenis
Query<T>
objek aman sehingga Anda tidak perlu lagi menggunakan@SuppressWarnings
atau menerapkan beberapa peretasan untuk menghilangkan peringatan compiler. Di Session API ,Session.createQuery
sekarang akan mengembalikan jenisQuery<T>
objek aman . Anda dapat menggunakannya dengan cara ini:Anda juga bisa menggunakannya saat hasil kueri tidak mengembalikan Cat:
Atau saat melakukan pemilihan parsial:
sumber
Kami memiliki masalah yang sama. Tapi itu bukan masalah besar bagi kami karena kami harus menyelesaikan masalah lain yang lebih besar dengan Hibernate Query and Session.
Secara khusus:
Jadi bagi kami, kami memiliki:
Dan terakhir,
AmplafiQuery memiliki "asList ()" yang merupakan versi yang diaktifkan secara generik dari Query.list () AmplafiQuery memiliki "unique ()" yang merupakan versi yang diaktifkan secara generik dari Query.uniqueResult () (dan hanya mencatat masalah daripada melontarkan pengecualian)
Ini banyak pekerjaan hanya untuk menghindari @SuppressWarnings. Namun, seperti yang saya katakan (dan terdaftar) ada banyak lainnya yang lebih baik! alasan untuk melakukan pekerjaan pembungkus.
sumber
Saya tahu ini lebih tua tetapi 2 hal yang perlu diperhatikan untuk hari ini di Matt Quails Answer.
Poin 1
Ini
Seharusnya begini
Butir 2
Dari ini
untuk ini
akan mengurangi peringatan lain secara jelas di reply original reply markers sudah di hapus oleh browser.
sumber
Coba ini:
sumber
cat
contoh itu.Solusi yang baik untuk menghindari peringatan keamanan tipe dengan kueri hibernasi adalah dengan menggunakan alat seperti TorpedoQuery untuk membantu Anda membangun HQL yang aman.
sumber
sumber
Jika Anda tidak ingin menggunakan @SuppressWarnings ("tidak dicentang"), Anda dapat melakukan hal berikut.
FYI - Saya membuat metode util yang melakukan ini untuk saya sehingga tidak mengotori kode saya dan saya tidak perlu menggunakan @SupressWarning.
sumber