चूंकि यह एक बहुत ही सामान्य प्रश्न है, इसलिए मैंने यह लेख लिखा है
, जिस पर यह उत्तर आधारित है।
setFirstResult
और setMaxResults
Query
तरीकों
एक JPA और हाइबरनेट के लिए Query
, setFirstResult
विधि के बराबर है OFFSET
, और setMaxResults
विधि LIMIT के बराबर है:
List<Post> posts = entityManager
.createQuery(
"select p " +
"from Post p " +
"order by p.createdOn ")
.setFirstResult(10)
.setMaxResults(10)
.getResultList();
LimitHandler
मतिहीनता
हाइबरनेट LimitHandler
डेटाबेस-विशिष्ट पेजिनेशन तर्क को परिभाषित करता है, और जैसा कि निम्नलिखित चित्र द्वारा चित्रित किया गया है, हाइबरनेट कई डेटाबेस-विशिष्ट पेजिनेशन विकल्पों का समर्थन करता है:
अब, आपके द्वारा उपयोग किए जा रहे अंतर्निहित रिलेशनल डेटाबेस सिस्टम के आधार पर, उपरोक्त JPQL क्वेरी उचित पेजिनेशन सिंटैक्स का उपयोग करेगी।
माई एसक्यूएल
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 ?
एस क्यू एल सर्वर
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
आकाशवाणी
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_ > ?
उपयोग करने का लाभ setFirstResult
और setMaxResults
यह है कि हाइबरनेट किसी भी समर्थित रिलेशनल डेटाबेस के लिए डेटाबेस-विशिष्ट पेजिनेशन सिंटैक्स उत्पन्न कर सकता है।
और, आप केवल JPQL प्रश्नों तक ही सीमित नहीं हैं। आप मूल SQL प्रश्नों के लिए setFirstResult
और setMaxResults
विधि सात का उपयोग कर सकते हैं ।
मूल निवासी SQL प्रश्न
देशी SQL प्रश्नों का उपयोग करते समय आपको डेटाबेस-विशिष्ट पेजिनेशन को हार्डकोड नहीं करना पड़ता है। सीतनिद्रा में होना अपने प्रश्नों को जोड़ सकते हैं।
इसलिए, यदि आप PostgreSQL पर इस SQL क्वेरी को निष्पादित कर रहे हैं:
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();
हाइबरनेट इसे इस प्रकार रूपांतरित करेगा:
SELECT p.id AS id,
p.title AS title
FROM post p
ORDER BY p.created_on
LIMIT ?
OFFSET ?
बिल्कुल सटीक?
SQL- आधारित पेजिनेशन से परे
जब आप फ़िल्टरिंग और सॉर्टिंग मानदंडों को अनुक्रमित कर सकते हैं, तो पृष्ठांकन अच्छा है। यदि आपकी पृष्ठांकन आवश्यकताएं गतिशील फ़िल्टरिंग को प्रभावित करती हैं, तो ElasticSearch जैसे इनवर्टेड-इंडेक्स समाधान का उपयोग करना बेहतर तरीका है।
की जाँच करें इस लेख अधिक जानकारी के लिए।
Hibernate-5.0.12
। क्या यह अभी भी उपलब्ध नहीं है? एक लाख या इतने रिकॉर्ड प्राप्त करना वास्तव में भारी होगा और फिर इस पर फ़िल्टर लागूsetMaxResults
करें- इस पर @Rachel द्वारा @skaffman द्वारा उत्तर में देखा गया।