Bu çok yaygın bir soru olduğundan, bu cevabın dayandığı bu makaleyi yazdım
.
setFirstResult
ve setMaxResults
Query
yöntemler
Bir JPA ve Hazırda Bekletme için Query
, setFirstResult
yöntem LIMIT eşdeğeridir OFFSET
ve setMaxResults
yöntem LIMIT eşdeğeridir:
List<Post> posts = entityManager
.createQuery(
"select p " +
"from Post p " +
"order by p.createdOn ")
.setFirstResult(10)
.setMaxResults(10)
.getResultList();
LimitHandler
soyutlama
Hazırda Beklet LimitHandler
, veritabanına özgü sayfalandırma mantığını tanımlar ve aşağıdaki diyagramda gösterildiği gibi Hazırda Beklet, veritabanına özgü birçok sayfalandırma seçeneğini destekler:
Şimdi, kullandığınız temel ilişkisel veritabanı sistemine bağlı olarak, yukarıdaki JPQL sorgusu uygun sayfalandırma sözdizimini kullanacaktır.
MySQL
SELECT p.id AS id1_0_,
p.created_on AS created_2_0_,
p.title AS title3_0_
FROM post p
ORDER BY p.created_on
LIMIT ?, ?
PostgreSQL
SELECT p.id AS id1_0_,
p.created_on AS created_2_0_,
p.title AS title3_0_
FROM post p
ORDER BY p.created_on
LIMIT ?
OFFSET ?
SQL Server
SELECT p.id AS id1_0_,
p.created_on AS created_on2_0_,
p.title AS title3_0_
FROM post p
ORDER BY p.created_on
OFFSET ? ROWS
FETCH NEXT ? ROWS ONLY
torpil
SELECT *
FROM (
SELECT
row_.*, rownum rownum_
FROM (
SELECT
p.id AS id1_0_,
p.created_on AS created_on2_0_,
p.title AS title3_0_
FROM post p
ORDER BY p.created_on
) row_
WHERE rownum <= ?
)
WHERE rownum_ > ?
Kullanmanın avantajı setFirstResult
ve setMaxResults
hazırda desteklenen herhangi bir ilişkisel veri tabanları için bir veritabanı özgü sayfalama sözdizimi türetebilmesidir.
Ayrıca, yalnızca JPQL sorgularıyla sınırlı değilsiniz. Yerel SQL sorguları için setFirstResult
ve setMaxResults
yöntem yedi'yi kullanabilirsiniz .
Yerel SQL sorguları
Yerel SQL sorgularını kullanırken veritabanına özgü sayfalandırmayı sabit olarak kodlamanız gerekmez. Hazırda Beklet, bunu sorgularınıza ekleyebilir.
Bu nedenle, bu SQL sorgusunu PostgreSQL'de yürütüyorsanız:
List<Tuple> posts = entityManager
.createNativeQuery(
"SELECT " +
" p.id AS id, " +
" p.title AS title " +
"from post p " +
"ORDER BY p.created_on", Tuple.class)
.setFirstResult(10)
.setMaxResults(10)
.getResultList();
Hazırda Bekletme modu aşağıdaki gibi dönüştürür:
SELECT p.id AS id,
p.title AS title
FROM post p
ORDER BY p.created_on
LIMIT ?
OFFSET ?
Harika, değil mi?
SQL tabanlı sayfalandırmanın ötesinde
Filtreleme ve sıralama ölçütlerini dizine ekleyebildiğinizde sayfalandırma iyidir. Sayfalandırma gereksinimleriniz dinamik filtreleme gerektiriyorsa, Elastik Arama gibi tersine çevrilmiş dizin çözümü kullanmak çok daha iyi bir yaklaşımdır.
Daha fazla ayrıntı için bu makaleye göz atın .
Hibernate-5.0.12
. Bu hala mevcut değil mi? Bir milyon kadar kayıt almak ve daha sonra filtreyi üzerine uygulamak,setMaxResults
@kaffman'ın cevabında @Rachel tarafından fark edildiği gibi gerçekten ağır olurdu .