Di Hibernate 3, apakah ada cara untuk melakukan yang setara dengan batas MySQL berikut di HQL?
select * from a_table order by a_table_column desc limit 0, 20;
Saya tidak ingin menggunakan setMaxResults jika memungkinkan. Ini tentu saja dimungkinkan pada versi Hibernate / HQL yang lama, tetapi tampaknya telah menghilang.
java
hibernate
hql
hibernate3
stevedbrown
sumber
sumber
Hibernate-5.0.12
. Apakah ini masih belum tersedia? Akan sangat berat untuk mendapatkan satu juta atau lebih catatan dan kemudian menerapkan filter di atasnya-setMaxResults
seperti yang diperhatikan oleh @Rachel dalam jawaban oleh @skaffman.Jawaban:
Ini diposting di forum Hibernate beberapa tahun yang lalu ketika ditanya tentang mengapa ini bekerja di Hibernate 2 tetapi tidak di Hibernate 3:
Jadi jika itu bekerja di Hibernate 2, sepertinya itu kebetulan, bukan oleh desain. Saya pikir ini karena parser Hibernate 2 HQL akan menggantikan bit kueri yang dikenali sebagai HQL, dan membiarkan sisanya seperti semula, sehingga Anda dapat menyelinap ke dalam beberapa SQL asli. Hibernate 3, bagaimanapun, memiliki AST HQL Parser yang tepat, dan itu jauh lebih sedikit memaafkan.
Saya pikir
Query.setMaxResults()
ini satu-satunya pilihan Anda.sumber
setMaxResults
yang akan mengambil jumlah baris hasil yang terbatas dari resultset dan menampilkannya kepada pengguna, dalam kasus saya saya memiliki 3 juta catatan yang di-query dan kemudian memanggil setMaxResults untuk mengatur 50 catatan tetapi saya tidak ingin melakukan itu, sementara permintaan itu sendiri saya ingin meminta 50 catatan, apakah ada cara untuk melakukan itu?setMaxResults
hibernate akan menambahkanlimit
bagian ke kueri. Itu tidak akan mendapatkan semua hasil. Anda dapat memeriksa kueri yang dihasilkannya dengan mengaktifkan:<property name="show_sql">true</property>
sumber
setFirstResult
sebenarnya disebutkan dalam jawaban ini sedangkan di sini dan di tempat lain mereka hanya mengatakansetMaxResults
ini dansetMaxResults
itu tanpa menyebutkan cara mengatur offset.Jika Anda tidak ingin menggunakan
setMaxResults()
padaQuery
objek maka Anda bisa kembali selalu revert menggunakan SQL normal.sumber
Jika Anda tidak ingin menggunakan setMaxResults, Anda juga dapat menggunakan Query.scroll sebagai ganti daftar, dan ambil baris yang Anda inginkan. Berguna untuk paging misalnya.
sumber
setMaxResults()
memuat pertama setiap catatan dalam memori dan kemudian membuat sublist, yang ketika ada ratusan ribu atau lebih catatan crash server, karena kehabisan memori. Namun saya bisa pergi dari permintaan mengetik JPA ke permintaan Hibernate melaluiQueryImpl hibernateQuery = query.unwrap(QueryImpl.class)
dan kemudian saya bisa menggunakanscroll()
metode seperti yang Anda sarankan.Anda dapat dengan mudah menggunakan pagination untuk ini.
Anda harus lulus
new PageRequest(0, 1)
untuk mengambil catatan dan dari daftar mengambil catatan pertama.sumber
The
setFirstResult
dansetMaxResults
Query
metodeUntuk JPA dan Hibernate
Query
,setFirstResult
metode ini setara denganOFFSET
, dansetMaxResults
metode ini setara dengan LIMIT:The
LimitHandler
abstraksiHibernate
LimitHandler
mendefinisikan logika pagination-spesifik-database, dan seperti yang diilustrasikan oleh diagram berikut, Hibernate mendukung banyak opsi pagination-spesifik-database:Sekarang, tergantung pada sistem basis data relasional yang Anda gunakan, kueri JPQL di atas akan menggunakan sintaks pagination yang tepat.
MySQL
PostgreSQL
SQL Server
Peramal
Keuntungan menggunakan
setFirstResult
dansetMaxResults
adalah bahwa Hibernate dapat menghasilkan sintaks pagination khusus-database untuk setiap basis data relasional yang didukung.Dan, Anda tidak terbatas pada permintaan JPQL saja. Anda bisa menggunakan
setFirstResult
dansetMaxResults
metode tujuh untuk kueri SQL asli.Kueri SQL asli
Anda tidak perlu melakukan hardcode pagination khusus basis data saat menggunakan query SQL asli. Hibernate dapat menambahkan itu ke kueri Anda.
Jadi, jika Anda menjalankan query SQL ini pada PostgreSQL:
Hibernate akan mengubahnya sebagai berikut:
Keren kan?
Di luar pagination berbasis SQL
Pagination bagus ketika Anda dapat mengindeks kriteria pemfilteran dan pengurutan. Jika persyaratan halaman Anda menyiratkan penyaringan dinamis, itu pendekatan yang jauh lebih baik untuk menggunakan solusi indeks terbalik, seperti ElasticSearch.
Lihat artikel ini untuk lebih jelasnya.
sumber
String hql = "select userName from AccountInfo order by points desc 5";
Ini bekerja untuk saya tanpa menggunakan
setmaxResults();
Berikan nilai maksimal di yang terakhir (dalam hal ini 5) tanpa menggunakan kata kunci
limit
. : Psumber
Pengamatan saya adalah bahwa meskipun Anda memiliki batas dalam HQL (hibernate 3.x), itu akan menyebabkan kesalahan parsing atau diabaikan. (jika Anda memesan + desc / asc sebelum batas, itu akan diabaikan, jika Anda tidak memiliki desc / asc sebelum batas, itu akan menyebabkan kesalahan penguraian)
sumber
Jika dapat mengatur batas dalam mode ini
Ini adalah kode yang sangat sederhana untuk menangani batas atau daftar.
sumber
sumber
Anda perlu menulis kueri asli, lihat ini .
sumber
Anda dapat menggunakan kueri di bawah ini
sumber
Cuplikan di bawah ini digunakan untuk melakukan kueri batas menggunakan HQL.
Anda bisa mendapatkan aplikasi demo di tautan ini .
sumber
sumber