Apa pro dan kontra menggunakan Kriteria atau HQL ? API Kriteria adalah cara berorientasi objek yang bagus untuk mengekspresikan kueri dalam Hibernate, tetapi kadang-kadang Kriteria Kueri lebih sulit dipahami / dibangun daripada HQL.
Kapan Anda menggunakan Kriteria dan kapan HQL? Apa yang Anda sukai dalam kasus penggunaan mana? Atau itu hanya masalah selera?
Jawaban:
Saya lebih suka Queri Kriteria untuk kueri dinamis. Misalnya, jauh lebih mudah untuk menambahkan beberapa pemesanan secara dinamis atau mengabaikan beberapa bagian (misalnya pembatasan) tergantung pada beberapa parameter.
Di sisi lain saya menggunakan HQL untuk query statis dan kompleks, karena jauh lebih mudah untuk memahami / membaca HQL. Juga, HQL sedikit lebih kuat, saya pikir, misalnya untuk tipe gabungan yang berbeda.
sumber
Ada perbedaan dalam hal kinerja antara HQL dan criteriaQuery, setiap kali Anda menjalankan kueri menggunakan criteriaQuery, itu membuat alias baru untuk nama tabel yang tidak mencerminkan dalam cache kueri terakhir untuk setiap DB. Ini mengarah ke overhead mengkompilasi SQL yang dihasilkan, mengambil lebih banyak waktu untuk dieksekusi.
Mengenai strategi pengambilan [http://www.hibernate.org/315.html]
sumber
Kriteria adalah API berorientasi objek, sedangkan HQL berarti penggabungan string. Itu berarti semua manfaat dari berorientasi objek berlaku:
Karena HQL sangat mirip dengan SQL (yang sebagian besar devs sudah kenal dengan baik) maka argumen "tidak harus diingat" ini tidak terlalu berpengaruh. Jika HQL lebih berbeda, maka ini akan lebih penting.
sumber
Saya biasanya menggunakan Kriteria ketika saya tidak tahu input apa yang akan digunakan pada potongan data mana. Seperti pada formulir pencarian di mana pengguna dapat memasukkan 1 hingga 50 item dan saya tidak tahu apa yang akan mereka cari. Sangat mudah untuk hanya menambahkan lebih ke kriteria saat saya memeriksa apa yang dicari pengguna. Saya pikir akan sedikit lebih repot untuk menempatkan permintaan HQL dalam keadaan itu. HQL sangat bagus ketika saya tahu persis apa yang saya inginkan.
sumber
HQL jauh lebih mudah dibaca, lebih mudah untuk debug menggunakan alat-alat seperti plugin Eclipse Hibernate, dan lebih mudah untuk login. Kueri kriteria lebih baik untuk membangun kueri dinamis di mana banyak perilaku ditentukan saat runtime. Jika Anda tidak tahu SQL, saya bisa mengerti menggunakan kriteria Kriteria, tetapi secara keseluruhan saya lebih suka HQL jika saya tahu apa yang saya inginkan dimuka.
sumber
Kriteria adalah satu-satunya cara untuk menentukan pencarian kunci alami yang mengambil keuntungan dari optimasi khusus di cache kueri tingkat kedua. HQL tidak memiliki cara untuk menentukan petunjuk yang diperlukan.
Anda dapat menemukan lebih banyak info di sini:
sumber
Kriteria Api adalah salah satu konsep Hibernate yang bagus. menurut pandangan saya ini adalah beberapa poin dimana kita dapat membuat perbedaan antara HQL dan Kriteria Api
sumber
limit offset:rows
Dalam hql Anda dapat menghindari injeksi sql menggunakansetParameter
Untuk menggunakan yang terbaik dari kedua dunia, ekspresifitas dan keringkasan HQL dan sifat dinamis Kriteria pertimbangkan untuk menggunakan Querydsl .
Querydsl mendukung JPA / Hibernate, JDO, SQL dan Collections.
Saya adalah pengelola Querydsl, jadi jawaban ini bias.
sumber
Bagi saya, Kriteria itu cukup mudah untuk Memahami dan membuat pertanyaan Dinamis. Tetapi kekurangan yang saya katakan sejauh ini adalah bahwa ia memuat semua banyak-satu dll hubungan karena kami hanya memiliki tiga jenis FetchModes yaitu Pilih, Proksi dan Default dan dalam semua kasus ini memuat banyak-satu (mungkin saya salah jika begitu membantu saya keluar :))
Masalah kedua dengan Kriteria adalah bahwa ia memuat objek lengkap yaitu jika saya ingin hanya memuat EmpName dari seorang karyawan, ia tidak akan muncul dengan insted ini muncul dengan objek Karyawan lengkap dan saya bisa mendapatkan EmpName dari itu karena ini benar-benar bekerja buruk di pelaporan . sedangkan HQL hanya memuat (tidak memuat asosiasi / hubungan) apa yang Anda inginkan sehingga meningkatkan kinerja berkali-kali.
Salah satu fitur dari Kriteria adalah bahwa ia akan aman dari SQL Injection karena pembuatan kueri yang dinamis di mana seperti dalam HQL sebagai permintaan Anda diperbaiki atau parameterisasi sehingga tidak aman dari SQL Injection.
Juga jika Anda menulis HQL di file aspx.cs Anda, maka Anda erat dengan ur DAL Anda.
Secara keseluruhan kesimpulan saya adalah bahwa ada tempat-tempat di mana Anda tidak dapat hidup tanpa HQL seperti laporan jadi gunakan yang lain Kriteria lebih mudah untuk dikelola.
sumber
API Kriteria
Kriteria API lebih cocok untuk permintaan yang dihasilkan secara dinamis. Jadi, jika Anda ingin menambahkan filter klausa WHERE, GABUNG klausa, atau ubah klausa ORDER BY atau kolom proyeksi, maka API Kriteria dapat membantu Anda membuat kueri secara dinamis dengan cara yang juga mencegah serangan SQL Injection .
Di sisi lain, kueri Kriteria kurang ekspresif dan bahkan dapat menyebabkan kueri SQL yang sangat rumit dan tidak efisien, seperti yang dijelaskan dalam artikel ini .
JPQL dan HQL
JPQL adalah bahasa permintaan entitas standar JPA sementara HQL memperluas JPQL dan menambahkan beberapa fitur khusus Hibernate.
JPQL dan HQL sangat ekspresif dan menyerupai SQL. Tidak seperti Kriteria API, JPQL dan HQL membuatnya mudah untuk memprediksi permintaan SQL yang mendasarinya yang dihasilkan oleh penyedia JPA. Juga jauh lebih mudah untuk meninjau kueri HQL seseorang daripada yang Kriteria.
Perlu dicatat bahwa memilih entitas dengan JPQL atau API Kriteria masuk akal jika Anda perlu memodifikasinya. Kalau tidak, proyeksi DTO adalah pilihan yang jauh lebih baik.
Kesimpulan
Jika Anda tidak perlu memvariasikan struktur kueri entitas, maka gunakan JPQL atau HQL. Jika Anda perlu mengubah kriteria pemfilteran atau pengurutan atau mengubah proyeksi, maka gunakan API Kriteria.
Namun, hanya karena Anda menggunakan JPA atau Hibernate, itu tidak berarti Anda tidak boleh menggunakan SQL asli. Permintaan SQL sangat berguna dan JPQL dan API Kriteria bukan pengganti untuk SQL. Lihat artikel ini untuk detail lebih lanjut tentang topik ini.
sumber
Bagi saya, kemenangan terbesar pada Kriteria adalah API Contoh, di mana Anda dapat melewatkan objek dan hibernasi akan membangun kueri berdasarkan properti objek tersebut.
Selain itu, kriteria API memiliki keanehannya (saya percaya tim hibernate sedang mengerjakan ulang apinya), seperti:
Saya cenderung menggunakan HQL ketika saya ingin kueri yang mirip dengan sql (hapus dari Pengguna di mana status = 'diblokir'), dan saya cenderung menggunakan kriteria ketika saya tidak ingin menggunakan penambahan string.
Keuntungan lain dari HQL adalah bahwa Anda dapat menentukan semua pertanyaan Anda sebelumnya, dan bahkan membuatnya menjadi file atau lebih.
sumber
Kriteria api menyediakan satu fitur berbeda yang tidak disediakan oleh SQL atau HQL. yaitu. memungkinkan kompilasi memeriksa waktu permintaan.
sumber
Kami menggunakan sebagian besar Kriteria dalam aplikasi kami di awal tetapi setelah itu diganti dengan HQL karena masalah kinerja.
Terutama kami menggunakan kueri yang sangat kompleks dengan beberapa gabungan yang mengarah ke beberapa kueri dalam Kriteria tetapi sangat dioptimalkan dalam HQL.
Kasusnya adalah bahwa kita hanya menggunakan beberapa properti pada objek tertentu dan bukan objek lengkap. Dengan Kriteria masalah juga merangkai tali.
Katakanlah jika Anda perlu menampilkan nama dan nama pengguna di HQL itu cukup mudah
(name || ' ' || surname)
tetapi di Crteria ini tidak mungkin.Untuk mengatasi ini kami menggunakan ResultTransormers, di mana ada metode di mana rangkaian tersebut diimplementasikan untuk hasil yang diperlukan.
Hari ini kami terutama menggunakan HQL seperti ini:
jadi dalam kasus kami catatan yang dikembalikan adalah peta properti yang dibutuhkan.
sumber
sumber
sumber
CriteriaUpdate<T>
danCriteriaDelete<T>
untuk referensi.Kriteria kueri untuk secara dinamis kita dapat membuat kueri berdasarkan input kita .. Dalam kasus permintaan Hql adalah permintaan statis setelah kita membuat kita tidak dapat mengubah struktur kueri.
sumber
Saya tidak ingin menendang kuda mati di sini, tetapi penting untuk menyebutkan bahwa kriteria Kriteria sekarang sudah tidak digunakan lagi. Gunakan HQL.
sumber
Saya juga lebih suka Kueri Kriteria untuk kueri dinamis. Tapi saya lebih suka hql untuk menghapus kueri, misalnya jika menghapus semua catatan dari tabel anak untuk induk id 'xyz', itu mudah dicapai oleh HQL, tetapi untuk kriteria API pertama kita harus mem-burn n jumlah permintaan penghapusan di mana n adalah jumlah anak catatan tabel.
sumber
Sebagian besar jawaban di sini menyesatkan dan menyebutkan bahwa
Criteria Queries
lebih lambat daripadaHQL
, yang sebenarnya tidak demikian.Jika Anda mempelajari lebih dalam dan melakukan beberapa tes, Anda akan melihat Kriteria Query berkinerja lebih baik daripada HQL biasa .
Dan juga dengan Kriteria Kueri Anda mendapatkan kontrol Berorientasi Objek yang tidak ada dengan HQL .
Untuk informasi lebih lanjut, baca jawaban ini di sini .
sumber
Ada cara lain. Saya akhirnya dengan membuat parser HQL berdasarkan sintaks asli hibernate sehingga pertama mem-parsing HQL maka bisa secara dinamis menyuntikkan parameter dinamis atau secara otomatis menambahkan beberapa filter umum untuk permintaan HQL. Ini sangat bagus!
sumber
Posting ini cukup lama. Sebagian besar jawaban berbicara tentang kriteria Hibernate, bukan kriteria JPA. JPA 2.1 menambahkan CriteriaDelete / CriteriaUpdate, dan EntityGraph yang mengontrol apa yang harus diambil. API Kriteria lebih baik karena Java adalah OO. Itu sebabnya JPA dibuat. Ketika JPQL dikompilasi, itu akan diterjemahkan ke pohon AST (model OO) sebelum diterjemahkan ke SQL.
sumber
HQL dapat menyebabkan masalah keamanan seperti injeksi SQL.
sumber