যেহেতু এটি একটি খুব সাধারণ প্রশ্ন, আমি এই নিবন্ধটি লিখেছি
, যার ভিত্তিতে এই উত্তরটি ভিত্তিক।
setFirstResult
এবং setMaxResults
Query
পদ্ধতি
একটি জেপিএ এবং হাইবারনেটের জন্য Query
, setFirstResult
পদ্ধতিটি সমান OFFSET
, এবং setMaxResults
পদ্ধতিটি লিমিটের সমতুল্য:
List<Post> posts = entityManager
.createQuery(
"select p " +
"from Post p " +
"order by p.createdOn ")
.setFirstResult(10)
.setMaxResults(10)
.getResultList();
LimitHandler
বিমূর্তন
হাইবারনেট LimitHandler
ডাটাবেস-নির্দিষ্ট পৃষ্ঠাগুলি যুক্তি সংজ্ঞায়িত করে এবং নিম্নলিখিত চিত্র দ্বারা চিত্রিত হিসাবে, হাইবারনেট অনেকগুলি ডাটাবেস-নির্দিষ্ট পৃষ্ঠাগুলি বিকল্প সমর্থন করে:
এখন, আপনি ব্যবহার করছেন অন্তর্নিহিত সম্পর্কিত সম্পর্কিত ডাটাবেস সিস্টেমের উপর নির্ভর করে, উপরের জেপিকিউএল কোয়েরি যথাযথ পৃষ্ঠাগুলি সিনট্যাক্স ব্যবহার করবে।
মাইএসকিউএল
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 ?, ?
পোস্টগ্রি
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 সার্ভার
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
হাইডারনেট কোনও সমর্থিত রিলেশনাল ডাটাবেসগুলির জন্য ডাটাবেস-নির্দিষ্ট পৃষ্ঠাগুলি সিনট্যাক্স তৈরি করতে পারে।
এবং, আপনি কেবল জেপিকিউএল কোয়েরিতে সীমাবদ্ধ নন। আপনি ব্যবহার করতে পারেনsetFirstResult
setMaxResults
নেটিভ এসকিউএল প্রশ্নের জন্য এবং পদ্ধতিটি সাতটি ।
নেটিভ এসকিউএল কোয়েরি
নেটিভ এসকিউএল কোয়েরিগুলি ব্যবহার করার সময় আপনাকে ডাটাবেস-নির্দিষ্ট পৃষ্ঠাগুলি হার্ডকোড করতে হবে না। হাইবারনেট এটি আপনার প্রশ্নের সাথে যুক্ত করতে পারে।
সুতরাং, আপনি যদি পোস্টগ্রিজ এসকিউএলে এই এসকিউএল কোয়েরিটি সম্পাদন করছেন:
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 ?
ঠিক আছে তো?
এসকিউএল-ভিত্তিক পৃষ্ঠাগুলি ছাড়িয়ে
পৃষ্ঠা ছাঁটাই ভাল যখন আপনি ফিল্টারিং এবং বাছাইয়ের মানদণ্ডকে সূচক করতে পারেন। যদি আপনার পৃষ্ঠাগ্রন্থের প্রয়োজনীয়তা গতিশীল ফিল্টারিংকে বোঝায় তবে ইলাস্টিক অনুসন্ধানের মতো ইনভার্টেড-ইনডেক্স সমাধানটি ব্যবহার করার জন্য এটি আরও অনেক ভাল পদ্ধতির।
পরীক্ষা করে দেখুন এই নিবন্ধটি আরো বিস্তারিত জানার জন্য।
Hibernate-5.0.12
। এটি কি এখনও পাওয়া যায় না? এক মিলিয়ন বা তার বেশি রেকর্ড পাওয়া এবং তারপরেsetMaxResults
এটির ফিল্টার প্রয়োগ করা সত্যিই ভারী হবে - এটি উপরের উপর @ র্যাচেলের দ্বারা @ স্কাফম্যানের উত্তরে লক্ষ্য করা গেছে।