JPA (Java Persistence API) ব্যবহার করে ডেটাবেস থেকে ডেটা ফেচ করার সময়, অনেক ক্ষেত্রেই বিশাল পরিমাণ ডেটা একসাথে লোড করা হয়, যা অ্যাপ্লিকেশনের পারফরম্যান্সে প্রভাব ফেলতে পারে। Pagination (পৃষ্ঠা ভাগ করা) এবং Sorting (সর্টিং) হল দুটি গুরুত্বপূর্ণ কৌশল, যা জেপিএ-তে ব্যবহৃত হয় ডেটার আউটপুটকে সীমিত এবং সাজানো অবস্থায় ফেরত আনার জন্য।
Pagination (পৃষ্ঠা ভাগ করা)
Pagination এর মাধ্যমে আপনি ডেটাবেসের বড় ডেটাসেটকে ছোট ছোট পৃষ্ঠায় ভাগ করে নিতে পারেন। এতে অ্যাপ্লিকেশনটি দ্রুত কাজ করে এবং ব্যবহারকারীরা প্রয়োজনীয় ডেটা দ্রুত দেখতে পারে।
JPA তে pagination সাধারণত setFirstResult() এবং setMaxResults() মেথডের মাধ্যমে করা হয়, যা জিপিকুয়েল (JPQL) কুয়েরি বা Criteria API এর মাধ্যমে ডেটা সীমানিত করতে ব্যবহৃত হয়।
Pagination উদাহরণ:
ধরা যাক, আমরা একটি Employee Entity থেকে ডেটা ফেচ করতে চাই এবং শুধুমাত্র প্রথম 10টি রেকর্ড দেখতে চাই।
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;
public class EmployeeService {
private EntityManager entityManager;
public List<Employee> getEmployeesPaginated(int pageNumber, int pageSize) {
// JPQL কুয়েরি তৈরি করা
String jpql = "SELECT e FROM Employee e";
Query query = entityManager.createQuery(jpql);
// Pagination সেট করা
query.setFirstResult((pageNumber - 1) * pageSize); // Skip প্রথম (pageNumber - 1) * pageSize রেকর্ড
query.setMaxResults(pageSize); // প্রতি পৃষ্ঠায় maximum record limit
return query.getResultList(); // Pagination এর মাধ্যমে ফলাফল নিয়ে আসা
}
}
এখানে:
setFirstResult(): এই মেথডটি কোন রেকর্ড থেকে শুরু করবে তা নির্ধারণ করে।setMaxResults(): এই মেথডটি প্রতিটি পৃষ্ঠায় কতটি রেকর্ড দেখানো হবে তা নির্ধারণ করে।
Usage Example:
List<Employee> employees = employeeService.getEmployeesPaginated(1, 10); // প্রথম পৃষ্ঠা, প্রতি পৃষ্ঠায় 10 রেকর্ড
এখানে প্রথম পৃষ্ঠায় 10টি Employee রেকর্ড ফেচ করা হবে।
Sorting (সর্টিং)
Sorting এর মাধ্যমে আপনি ডেটা নির্দিষ্ট একটি কলামের ভিত্তিতে সাজাতে পারেন। JPA তে JPQL বা Criteria API ব্যবহার করে ডেটা সাজানো যায়। ORDER BY কিওয়ার্ডটি JPQL তে ডেটা সাজানোর জন্য ব্যবহৃত হয়।
Sorting উদাহরণ:
ধরা যাক, আমরা Employee Entity থেকে কর্মচারীদের নামের ভিত্তিতে সাজানো ডেটা ফেচ করতে চাই।
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;
public class EmployeeService {
private EntityManager entityManager;
public List<Employee> getEmployeesSortedByName() {
// JPQL কুয়েরি তৈরি করা
String jpql = "SELECT e FROM Employee e ORDER BY e.name ASC"; // Ascending order (ASC)
Query query = entityManager.createQuery(jpql);
return query.getResultList(); // Sorting অনুযায়ী ফলাফল নিয়ে আসা
}
}
এখানে:
ORDER BY e.name ASC:EmployeeEntity এর নাম (name) এর ভিত্তিতে ডেটাকে Ascending (ASC) অর্ডারে সাজানো হচ্ছে।
Descending Sorting:
String jpql = "SELECT e FROM Employee e ORDER BY e.name DESC"; // Descending order (DESC)
এখানে:
ORDER BY e.name DESC:EmployeeEntity এর নাম (name) এর ভিত্তিতে ডেটা Descending (DESC) অর্ডারে সাজানো হচ্ছে।
Pagination এবং Sorting একসাথে ব্যবহার করা
বেশিরভাগ সময়, আপনি Pagination এবং Sorting একসাথে ব্যবহার করবেন যাতে বড় ডেটাসেটকে সাজানো এবং পৃষ্ঠা ভাগ করে দেখানো যায়।
Pagination এবং Sorting একসাথে উদাহরণ:
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;
public class EmployeeService {
private EntityManager entityManager;
public List<Employee> getEmployeesPaginatedAndSorted(int pageNumber, int pageSize) {
// JPQL কুয়েরি তৈরি করা
String jpql = "SELECT e FROM Employee e ORDER BY e.name ASC"; // Sorting by name
Query query = entityManager.createQuery(jpql);
// Pagination সেট করা
query.setFirstResult((pageNumber - 1) * pageSize); // Skip first (pageNumber - 1) * pageSize records
query.setMaxResults(pageSize); // Limit to max pageSize records
return query.getResultList(); // Pagination and Sorting এর মাধ্যমে ফলাফল নিয়ে আসা
}
}
Usage Example:
List<Employee> employees = employeeService.getEmployeesPaginatedAndSorted(1, 10); // প্রথম পৃষ্ঠা, প্রতি পৃষ্ঠায় 10 রেকর্ড, নাম অনুযায়ী সাজানো
এখানে:
- ডেটাবেসে প্রথম 10টি
Employeeরেকর্ড name অনুসারে Ascending অর্ডারে সাজানো হবে।
Criteria API ব্যবহার করে Pagination এবং Sorting
Criteria API ব্যবহার করে ডাইনামিকভাবে Query তৈরি করা যায় এবং এতে Pagination এবং Sorting খুব সহজে একসাথে ব্যবহৃত হতে পারে। CriteriaBuilder এবং CriteriaQuery ব্যবহার করে আপনি এই অপারেশনগুলো সম্পাদন করতে পারেন।
Criteria API উদাহরণ:
import javax.persistence.EntityManager;
import javax.persistence.criteria.*;
import java.util.List;
public class EmployeeService {
private EntityManager entityManager;
public List<Employee> getEmployeesPaginatedAndSortedCriteria(int pageNumber, int pageSize) {
// Criteria API তৈরি
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Employee> criteriaQuery = criteriaBuilder.createQuery(Employee.class);
Root<Employee> root = criteriaQuery.from(Employee.class);
// Sorting by name
criteriaQuery.select(root).orderBy(criteriaBuilder.asc(root.get("name"))); // Ascending order
// Create the query
javax.persistence.Query query = entityManager.createQuery(criteriaQuery);
// Pagination
query.setFirstResult((pageNumber - 1) * pageSize);
query.setMaxResults(pageSize);
return query.getResultList();
}
}
এখানে:
CriteriaBuilderব্যবহার করে Criteria Query তৈরি করা হয়েছে।criteriaQuery.select(root).orderBy()দ্বারা ডেটা name অনুসারে সাজানো হচ্ছে।setFirstResult()এবংsetMaxResults()দ্বারা Pagination সেট করা হচ্ছে।
সারাংশ
JPA তে Pagination এবং Sorting এর মাধ্যমে ডেটার লোড এবং প্রদর্শন সহজ এবং কার্যকরী করা যায়।
- Pagination ব্যবহার করে আপনি ডেটাবেসের বড় ডেটাসেটকে ছোট ছোট পৃষ্ঠায় ভাগ করতে পারেন, যা অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করে।
- Sorting ব্যবহার করে ডেটাকে নির্দিষ্ট ফিল্ডের ভিত্তিতে সাজানো যায়।
- Criteria API এবং JPQL এর মাধ্যমে Pagination এবং Sorting এর সমন্বয় করা যায়, যা ডেটাবেসে বড় পরিমাণ ডেটা ম্যানেজমেন্টের জন্য গুরুত্বপূর্ণ।
Pagination (পৃষ্ঠা বিভাজন) হল একটি ডেটা প্রদর্শন কৌশল যা খুব বড় ডেটাসেটের মধ্যে থেকে একটি নির্দিষ্ট সংখ্যক ডেটা একসাথে প্রদর্শন করার সুবিধা দেয়। যখন ডেটাবেসে প্রচুর পরিমাণ ডেটা থাকে, তখন pagination ব্যবহার করা হয় যাতে পুরো ডেটাবেস লোড না করে শুধুমাত্র প্রয়োজনীয় ডেটা একটি নির্দিষ্ট পৃষ্ঠা অনুযায়ী দেখানো যায়। এটি ওয়েব অ্যাপ্লিকেশনগুলির কর্মক্ষমতা বাড়াতে সাহায্য করে, কারণ এটি কম মেমরি ব্যবহার করে এবং লোডিং সময় কমিয়ে দেয়।
JPA তে pagination ব্যবহার করা হয় ডেটাবেসের রেকর্ডগুলির মধ্যে একটি নির্দিষ্ট সংখ্যক রেকর্ড একবারে লোড করতে। JPA pagination-এ ডেটা ফেচ করার জন্য setFirstResult এবং setMaxResults মেথডগুলি ব্যবহার করা হয়।
Pagination এর প্রয়োজনীয়তা
- কর্মক্ষমতা উন্নয়ন:
- ডেটাবেসে বিশাল পরিমাণ ডেটা থাকলে, একাধিক রেকর্ড একসাথে লোড করলে এটি অ্যাপ্লিকেশনের কর্মক্ষমতাকে প্রভাবিত করতে পারে। Pagination এর মাধ্যমে শুধুমাত্র নির্দিষ্ট পরিমাণ রেকর্ড লোড করার মাধ্যমে কর্মক্ষমতা উন্নত করা যায়।
- ইউজার ইন্টারফেসে ভালো অভিজ্ঞতা:
- ব্যবহারকারীরা একটি বড় ডেটাসেটের মধ্যে স্ক্রল করে যেতে পারে অথবা একাধিক পৃষ্ঠা দেখতে পছন্দ করেন। Pagination ব্যবহারকারীদের একটি নির্দিষ্ট পরিমাণ তথ্য পৃষ্ঠা বাই পৃষ্ঠা দেখতে দেয়, যা তাদের জন্য সহজ এবং দ্রুত।
- রিসোর্স অপটিমাইজেশন:
- Pagination এর মাধ্যমে শুধুমাত্র প্রয়োজনীয় ডেটা রিট্রাইভ করা হয়, ফলে সিস্টেম রিসোর্স যেমন মেমরি, ব্যান্ডউইথ ইত্যাদির অপচয় কমানো হয়।
- ডেটাবেসে দক্ষ কুয়েরি অপটিমাইজেশন:
- ডেটাবেসে পৃষ্ঠা বিভাজন ব্যবহার করে কুয়েরি অপটিমাইজ করা যায় এবং এভাবে বড় ডেটাসেটের সঙ্গে কাজ করার সময় কম সময় নেয়।
JPA তে Pagination এর বাস্তবায়ন
JPA তে pagination বাস্তবায়ন করার জন্য আমরা সাধারণত Query বা TypedQuery ব্যবহার করি এবং setFirstResult() এবং setMaxResults() মেথডগুলি ব্যবহার করে পৃষ্ঠা বিভাজন কনফিগার করি।
JPA Pagination উদাহরণ:
ধরা যাক, আমাদের কাছে একটি Employee Entity রয়েছে এবং আমরা ২০টি Employee রেকর্ড এক পৃষ্ঠায় দেখাতে চাই। আমরা দুটি প্যারামিটার ব্যবহার করব:
pageNumber: যে পৃষ্ঠাটি দেখাতে হবে।pageSize: প্রতিটি পৃষ্ঠায় কতটি রেকর্ড দেখানো হবে।
Entity Class (Employee):
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Employee {
@Id
private int id;
private String name;
private String department;
// Getters and Setters
}
Pagination Query Example:
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import java.util.List;
public class EmployeeService {
private EntityManager entityManager;
public List<Employee> getEmployees(int pageNumber, int pageSize) {
// Calculate the first result (skip)
int firstResult = (pageNumber - 1) * pageSize;
// Create the JPQL query
String jpql = "SELECT e FROM Employee e";
TypedQuery<Employee> query = entityManager.createQuery(jpql, Employee.class);
// Set pagination parameters
query.setFirstResult(firstResult); // Skip the first 'firstResult' results
query.setMaxResults(pageSize); // Set the number of results per page
return query.getResultList();
}
}
এখানে:
setFirstResult(firstResult): এই মেথডটি প্রথম ফলাফল থেকে কতগুলো রেকর্ড স্কিপ (skip) করতে হবে তা নির্ধারণ করে। এটি pageNumber এবং pageSize এর মাধ্যমে নির্ধারিত হয়।setMaxResults(pageSize): এই মেথডটি প্রতিটি পৃষ্ঠায় কতগুলো রেকর্ড দেখানো হবে তা নির্ধারণ করে।
ব্যবহারকারীর জন্য পৃষ্ঠার সংখ্যা নির্ধারণ:
public class PaginationExample {
public static void main(String[] args) {
EmployeeService employeeService = new EmployeeService();
// Let's assume page 1 and page size of 10
List<Employee> employees = employeeService.getEmployees(1, 10);
for (Employee employee : employees) {
System.out.println("Employee ID: " + employee.getId() + ", Name: " + employee.getName());
}
}
}
এখানে, আমরা প্রথম পৃষ্ঠা (page 1) এবং পৃষ্ঠায় ১০টি Employee রেকর্ড দেখতে চাচ্ছি। getEmployees() মেথডটি JPA কুয়েরি ব্যবহার করে ডেটাবেস থেকে পৃষ্ঠার নির্দিষ্ট পরিমাণ রেকর্ড ফিরিয়ে আনবে।
Advanced Pagination Techniques:
Sorting:
- Pagination এর সাথে সাধারণত Sorting ব্যবহৃত হয়। আপনি JPQL তে ORDER BY কুয়েরি ব্যবহার করে ডেটা সাজাতে পারেন।
উদাহরণ:
String jpql = "SELECT e FROM Employee e ORDER BY e.name ASC";Counting Total Results:
- কখনো কখনো, আপনি পৃষ্ঠা বিভাজনের আগে মোট রেকর্ডের সংখ্যা জানতে চান, যাতে আপনি পৃষ্ঠার মোট সংখ্যা বা পরিমাণ নির্ধারণ করতে পারেন। এটি করার জন্য, আপনি একটি count query ব্যবহার করতে পারেন।
উদাহরণ:
String countQuery = "SELECT COUNT(e) FROM Employee e"; long totalRecords = entityManager.createQuery(countQuery, Long.class).getSingleResult();- Dynamic Pagination:
- আপনি dynamic pagination এর মাধ্যমে ইউজারের অনুসন্ধানের উপর ভিত্তি করে ডেটা পৃষ্ঠা বিভাজন করতে পারেন, যেমন ইউজার যদি নির্দিষ্ট কোনো বিভাগের জন্য ডেটা দেখতে চান।
সারাংশ
JPA Pagination হল একটি গুরুত্বপূর্ণ ফিচার যা বড় ডেটাসেটের মধ্যে কার্যকরভাবে ডেটা প্রদর্শন করতে সাহায্য করে। Pagination ব্যবহারে কর্মক্ষমতা বৃদ্ধি পায়, কারণ এটি শুধু একটি নির্দিষ্ট সংখ্যক রেকর্ড একটি পৃষ্ঠায় লোড করে। JPA তে pagination ব্যবহারের জন্য setFirstResult() এবং setMaxResults() মেথডগুলি ব্যবহার করা হয়, যা ক্লায়েন্ট সাইডে পৃষ্ঠা বিভাজন এবং ডেটা লোড করার প্রক্রিয়া সহজ করে। এর মাধ্যমে ডেটাবেস অপটিমাইজেশন, মেমরি ব্যবহারের দক্ষতা এবং ব্যবহারকারীর অভিজ্ঞতা বৃদ্ধি পায়।
JPA (Java Persistence API) আপনাকে ডেটাবেস থেকে ডেটা ফেচ করার জন্য JPQL (Java Persistence Query Language) অথবা Criteria API ব্যবহার করতে দেয়। যখন আপনার কাছে বড় ডেটাসেট থাকে এবং আপনাকে ডেটা পৃষ্ঠায় (pagination) লোড করতে হয়, তখন Query.setMaxResults() এবং Query.setFirstResult() ব্যবহার করা হয়।
Query.setMaxResults(): এটি জিজ্ঞাসার মাধ্যমে ফেরত আসা সর্বোচ্চ রেকর্ডের সংখ্যা সীমাবদ্ধ করে।Query.setFirstResult(): এটি জিজ্ঞাসার মাধ্যমে ফেরত আসা রেকর্ডের প্রথম অবস্থান (offset) নির্ধারণ করে।
এই দুটি পদ্ধতি একসাথে ব্যবহার করে pagination বা ডেটার একটি নির্দিষ্ট পরিমাণের ফলাফল স্কেল করা যায়।
১. Query.setMaxResults()
setMaxResults() পদ্ধতিটি ব্যবহার করে আপনি একটি কুয়েরি থেকে সর্বোচ্চ কতটি রেকর্ড রিটার্ন হবে তা নির্ধারণ করতে পারেন। এটি পেজিনেশন প্রয়োগ করতে ব্যবহৃত হয়, যেখানে আপনি চাইলে শুধুমাত্র নির্দিষ্ট সংখ্যক রেকর্ড ফেরত পেতে পারেন।
setMaxResults() উদাহরণ:
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;
public class EmployeeService {
private EntityManager entityManager;
public List<Employee> getEmployees(int maxResults) {
String jpql = "SELECT e FROM Employee e";
Query query = entityManager.createQuery(jpql);
query.setMaxResults(maxResults); // Limit the number of results
return query.getResultList();
}
}
এখানে:
query.setMaxResults(maxResults): এটিEmployeeEntity থেকে সর্বোচ্চmaxResultsসংখ্যক রেকর্ড ফেরত আনবে।
ব্যবহার:
যেমন, আপনি যদি শুধুমাত্র 10টি রেকর্ড পেতে চান, তাহলে:
getEmployees(10);
এটি 10টির বেশি রেকর্ড রিটার্ন করবে না, এমনকি যদি ডেটাবেসে আরও রেকর্ড থাকে।
২. Query.setFirstResult()
setFirstResult() পদ্ধতিটি ব্যবহার করে আপনি কুয়েরি ফলাফলের প্রথম রেকর্ড থেকে কতগুলি রেকর্ড শুরু হবে তা নির্ধারণ করতে পারেন। এটি সাধারণত pagination এর জন্য ব্যবহৃত হয়, যেখানে আপনি প্রথম রেকর্ডের অবস্থান এবং পরবর্তী রেকর্ডের জন্য একটি অস্থায়ী "offset" নির্ধারণ করেন।
setFirstResult() উদাহরণ:
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;
public class EmployeeService {
private EntityManager entityManager;
public List<Employee> getEmployees(int pageNumber, int pageSize) {
String jpql = "SELECT e FROM Employee e";
Query query = entityManager.createQuery(jpql);
int firstResult = (pageNumber - 1) * pageSize;
query.setFirstResult(firstResult); // Start from the first result of this page
query.setMaxResults(pageSize); // Limit the number of results per page
return query.getResultList();
}
}
এখানে:
query.setFirstResult(firstResult): এটি কুয়েরি ফলাফলের শুরু পয়েন্ট নির্ধারণ করে।firstResultহল যে পৃষ্ঠাটি আপনি দেখতে চান তার প্রথম রেকর্ডের ইনডেক্স।query.setMaxResults(pageSize): এটি প্রতি পৃষ্ঠায় সর্বোচ্চ রেকর্ডের সংখ্যা সীমাবদ্ধ করে।
ব্যবহার:
যেমন, যদি আপনি দ্বিতীয় পৃষ্ঠার প্রথম 10 রেকর্ড দেখতে চান:
getEmployees(2, 10); // 2nd page, 10 records per page
এটি প্রথম 10টি রেকর্ড বাদ দিয়ে পরবর্তী 10টি রেকর্ড রিটার্ন করবে (যেটি ১১-২০ রেকর্ডের মধ্যে হবে)।
৩. Pagination Example
যেমন, আপনি ১ম পৃষ্ঠা থেকে ১০টি রেকর্ড এবং ২য় পৃষ্ঠা থেকে ১০টি রেকর্ড দেখতে চান, তখন আপনি setFirstResult() এবং setMaxResults() দুটি পদ্ধতি একত্রে ব্যবহার করবেন।
Pagination উদাহরণ:
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;
public class EmployeeService {
private EntityManager entityManager;
public List<Employee> getEmployees(int pageNumber, int pageSize) {
String jpql = "SELECT e FROM Employee e";
Query query = entityManager.createQuery(jpql);
int firstResult = (pageNumber - 1) * pageSize; // Calculate the first result (offset)
query.setFirstResult(firstResult); // Set the starting point
query.setMaxResults(pageSize); // Set the maximum number of results to return
return query.getResultList();
}
}
ব্যবহার:
- প্রথম পৃষ্ঠা:
getEmployees(1, 10); // 1st page, 10 records per page
- দ্বিতীয় পৃষ্ঠা:
getEmployees(2, 10); // 2nd page, 10 records per page
এখানে, setFirstResult() এবং setMaxResults() ব্যবহার করে আপনি কার্যকরভাবে pagination বাস্তবায়ন করতে পারেন।
৪. টোটাল রেকর্ড এবং পৃষ্ঠার সংখ্যা বের করা
কখনও কখনও, আপনি মোট রেকর্ড সংখ্যা জানতে চান এবং সেই অনুযায়ী পৃষ্ঠার সংখ্যা বের করতে চান। এটি সাধারণত পেজিনেশনের ক্ষেত্রে ব্যবহৃত হয়।
টোটাল রেকর্ড কুয়েরি উদাহরণ:
public long getTotalEmployeeCount() {
String jpql = "SELECT COUNT(e) FROM Employee e";
Query query = entityManager.createQuery(jpql);
return (long) query.getSingleResult();
}
এটি ডেটাবেস থেকে মোট কর্মচারী সংখ্যা ফেরত দেবে। আপনি এই সংখ্যার ভিত্তিতে পৃষ্ঠার সংখ্যা হিসাব করতে পারবেন।
পৃষ্ঠার সংখ্যা হিসাব করা:
long totalEmployees = getTotalEmployeeCount();
int pageSize = 10;
int totalPages = (int) Math.ceil(totalEmployees / (double) pageSize);
এখানে:
totalEmployees: মোট কর্মচারী সংখ্যা।pageSize: প্রতিটি পৃষ্ঠার রেকর্ড সংখ্যা।totalPages: মোট পৃষ্ঠার সংখ্যা।
সারাংশ
Query.setMaxResults() এবং Query.setFirstResult() পদ্ধতিগুলি JPA-তে pagination এবং result limiting এর জন্য ব্যবহৃত হয়। এগুলি ব্যবহার করে আপনি:
setMaxResults(): সর্বোচ্চ কতটি রেকর্ড ফেরত আসবে তা সীমাবদ্ধ করতে পারেন।setFirstResult(): কুয়েরি ফলাফল থেকে প্রথম রেকর্ডের অবস্থান নির্ধারণ করতে পারেন, যা পৃষ্ঠায় (pagination) ডেটা লোড করতে সহায়তা করে।
এই দুটি পদ্ধতি একসাথে ব্যবহার করে আপনি কার্যকরভাবে পৃষ্ঠায় ডেটা লোড এবং pagination সিস্টেম তৈরি করতে পারবেন, যা ডেটাবেস থেকে বড় পরিমাণ ডেটা লোড করার সময় কার্যকারিতা বৃদ্ধি করতে সহায়তা করে।
JPA (Java Persistence API)-তে sorting বা অর্ডারিং খুবই গুরুত্বপূর্ণ, বিশেষ করে যখন আপনি ডেটাবেস থেকে ডেটা রিটার্ন করছেন এবং সেই ডেটা একটি নির্দিষ্ট কৃতক্রমে (order) সাজাতে চান। @OrderBy অ্যানোটেশনটি JPA-তে ব্যবহৃত হয় Entity Relationship এর মাধ্যমে ডেটা সাজানোর জন্য, যখন আপনি একটি Collection বা List এর মধ্যে সম্পর্কিত ডেটা সাজাতে চান।
এই অ্যানোটেশনটি এক বা একাধিক প্রপার্টির ভিত্তিতে ডেটা সাজানোর জন্য ব্যবহৃত হয়।
@OrderBy অ্যানোটেশন
@OrderBy অ্যানোটেশনটি JPA-তে Collection বা List এর মধ্যে রিলেটেড Entity গুলোর সাজানোর জন্য ব্যবহৃত হয়। এটি মূলত JPA Relationship Mapping এর অংশ হিসেবে ব্যবহৃত হয় এবং Entity-এর প্রপার্টি অনুযায়ী ascending বা descending অর্ডারে ডেটা রিটার্ন করে।
@OrderBy Syntax:
@OrderBy("propertyName ASC|DESC")
propertyName: এটি সেই প্রপার্টি যা আপনি সাজাতে চান।ASC: ascending order (ছোট থেকে বড়)DESC: descending order (বড় থেকে ছোট)
@OrderBy উদাহরণ
ধরা যাক, দুটি Entity ক্লাস Department এবং Employee রয়েছে, যেখানে একটি Department Entity এর সাথে একাধিক Employee Entity সম্পর্কিত থাকে। আমরা চাই যে, কর্মচারীদের নাম অনুযায়ী (ascending order) সাজাতে।
Department Entity:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import java.util.List;
@Entity
public class Department {
@Id
private Long id;
private String name;
@OneToMany(mappedBy = "department")
@OrderBy("name ASC") // Sorting employees by name in ascending order
private List<Employee> employees;
// Getters and Setters
}
Employee Entity:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
public class Employee {
@Id
private Long id;
private String name;
@ManyToOne
private Department department;
// Getters and Setters
}
এখানে:
- Department Entity তে @OneToMany সম্পর্কের মাধ্যমে Employee Entity গুলির মধ্যে সম্পর্ক স্থাপন করা হয়েছে।
@OrderBy("name ASC"): এটি Employee এরnameপ্রপার্টি অনুযায়ী সাজানোর জন্য ব্যবহৃত হচ্ছে।
এখন, যখন আপনি Department Entity এর সাথে সম্পর্কিত Employee গুলির তালিকা বের করবেন, তা কর্মচারীদের নাম অনুযায়ী ascending order তে সাজানো থাকবে।
নোট:
@OrderByঅ্যানোটেশনটি শুধুমাত্র Collection বা List প্রপার্টির উপর ব্যবহৃত হয়।- এটি শুধু related Entity এর উপরে প্রভাব ফেলবে, অর্থাৎ
@OneToMany,@ManyToManyসম্পর্কিত ক্ষেত্রে কার্যকরী হবে।
JPQL (Java Persistence Query Language) এ Sorting
আপনি যদি JPQL ব্যবহার করে কাস্টম কুয়েরি করতে চান এবং ডেটা সাজাতে চান, তবে ORDER BY ক্লজ ব্যবহার করতে পারেন। এটি SQL এর মতো কাজ করে এবং JPA-তে Entity ক্লাসের প্রপার্টি অনুযায়ী সাজানোর সুবিধা দেয়।
JPQL উদাহরণ:
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import java.util.List;
public class EmployeeService {
private EntityManager entityManager;
public List<Employee> getEmployeesByDepartmentSorted(Long departmentId) {
String jpql = "SELECT e FROM Employee e WHERE e.department.id = :departmentId ORDER BY e.name ASC";
TypedQuery<Employee> query = entityManager.createQuery(jpql, Employee.class);
query.setParameter("departmentId", departmentId);
return query.getResultList();
}
}
এখানে:
- JPQL কুয়েরি ব্যবহার করে Employee Entity-কে
nameপ্রপার্টি অনুযায়ী ascending order তে সাজানো হচ্ছে।
Sorting on Multiple Fields (একাধিক ফিল্ডে Sorting)
আপনি একাধিক ফিল্ডের ওপরও ডেটা সাজাতে পারেন। একাধিক প্রপার্টি সাজানোর জন্য @OrderBy বা JPQL উভয় ক্ষেত্রেই কমা দিয়ে প্রপার্টি নাম আলাদা করতে হবে।
@OrderBy এর মাধ্যমে একাধিক প্রপার্টি Sorting:
@OrderBy("name ASC, id DESC")
private List<Employee> employees;
এখানে:
nameপ্রপার্টি ascending order তে এবংidপ্রপার্টি descending order তে সাজানো হচ্ছে।
JPQL এর মাধ্যমে একাধিক প্রপার্টি Sorting:
String jpql = "SELECT e FROM Employee e ORDER BY e.name ASC, e.id DESC";
এখানে:
nameপ্রপার্টি ascending এবংidপ্রপার্টি descending order তে সাজানো হচ্ছে।
Sorting Performance and Best Practices
- Database Level Sorting: যখন আপনি JPA বা JPQL এর মাধ্যমে ডেটা সাজান, তখন সেটি ডেটাবেসে SQL ORDER BY ক্লজ হিসেবে রূপান্তরিত হয়। তাই অনেক রেকর্ডের সাথে কাজ করার সময় ডেটাবেসের পারফরম্যান্স নিশ্চিত করতে indexing ব্যবহার করুন।
- Avoid Large Fetches: যখন আপনি অনেক রেকর্ড ফেচ করেন এবং Sorting করেন, তখন Lazy Loading এবং FetchSize কনফিগারেশন ব্যবহার করুন যাতে একসাথে খুব বেশি রেকর্ড লোড না হয়।
- JPA Level Sorting: @OrderBy অ্যানোটেশনটি Collection বা List এর মধ্যে সম্পর্কিত Entity গুলো সজ্জিত করতে ব্যবহৃত হয়, তবে এটি memory-এ সাজানো হয়। যদি খুব বড় Collection থাকে, তবে ডেটাবেসে
ORDER BYব্যবহার করা ভালো।
সারাংশ
JPA তে @OrderBy অ্যানোটেশন এবং JPQL উভয়ই ডেটাবেস থেকে ডেটা সাজানোর জন্য ব্যবহার করা হয়। @OrderBy অ্যানোটেশনটি One-to-Many, Many-to-One, বা Many-to-Many সম্পর্কিত Entity গুলোর মধ্যে সাজানোর জন্য ব্যবহৃত হয়, এবং JPQL ডেটা সাজাতে ORDER BY ক্লজ ব্যবহার করে। একাধিক ফিল্ডে Sorting এবং Cascade Sorting করা সম্ভব, যা ডেটাবেস ম্যানিপুলেশন এবং পারফরম্যান্স উন্নত করতে সহায়তা করে।
JPA (Java Persistence API) এ Pagination এবং Sorting খুবই গুরুত্বপূর্ণ ফিচার যা ডেটাবেস থেকে বড় পরিমাণ ডেটা নিয়ে কাজ করার সময় কার্যকারিতা উন্নত করে। Pagination ব্যবহার করে আপনি নির্দিষ্ট পরিমাণ ডেটা ফেচ করতে পারেন এবং Sorting ব্যবহার করে আপনি ডেটাকে কোনো নির্দিষ্ট অর্ডারে সাজাতে পারেন। JPA তে pagination এবং sorting এর জন্য বেশ কিছু টুল রয়েছে, যা সহজে ডেটা এক্সট্র্যাকশন এবং প্রদর্শন করতে সহায়তা করে।
Pagination (পৃষ্ঠা ভাগ) কী?
Pagination হলো একটি প্রক্রিয়া যার মাধ্যমে ডেটার বড় সেটকে ছোট ছোট অংশে ভাগ করা হয়। এটি বিশেষভাবে উপকারী যখন ডেটাবেসে অনেক রেকর্ড থাকে এবং আপনি সমস্ত ডেটা একসাথে লোড করতে চান না।
JPA তে pagination সাধারণত Query তে setFirstResult() এবং setMaxResults() মেথড ব্যবহার করে করা হয়। এটি ডেটা রিটার্ন করার জন্য প্রথম রেকর্ডের অবস্থান এবং এক পেজে কতগুলো রেকর্ড রিটার্ন করতে হবে তা নির্ধারণ করে।
Sorting (সাজানো) কী?
Sorting হল একটি প্রক্রিয়া যার মাধ্যমে ডেটাকে নির্দিষ্ট ক্রমে সাজানো হয়। এটি আপনাকে অর্ডারে ডেটা প্রদর্শন করতে সহায়তা করে, যেমন ascending বা descending।
JPA তে sorting সাধারণত Query তে Order By ক্লজ ব্যবহার করে করা হয়, যা নির্দিষ্ট কলাম অনুযায়ী ডেটাকে সাজাতে সহায়তা করে।
Pagination এবং Sorting এর উদাহরণ
এখানে একটি Employee Entity রয়েছে এবং আমরা Pagination এবং Sorting প্রক্রিয়া ব্যবহার করে JPA তে ডেটা এক্সট্র্যাক্ট করব।
1. Employee Entity Example
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Employee {
@Id
private Long id;
private String name;
private Double salary;
// Constructors, Getters and Setters
public Employee(Long id, String name, Double salary) {
this.id = id;
this.name = name;
this.salary = salary;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
}
2. EmployeeRepository Interface (Pagination and Sorting)
Spring Data JPA ব্যবহার করলে আমরা সহজেই pagination এবং sorting যোগ করতে পারি। নিচে একটি EmployeeRepository interface আছে যা PagingAndSortingRepository ইন্টারফেস এক্সটেন্ড করেছে।
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Long> {
// You can define custom queries here if needed
}
এখানে:
- PagingAndSortingRepository ইন্টারফেসটি Employee Entity এর জন্য pagination এবং sorting সাপোর্ট করে।
3. Pagination and Sorting in Service Layer
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.data.domain.Page;
@Service
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
// Method for Pagination and Sorting
public Page<Employee> getEmployeesPaginatedAndSorted(int page, int size, String sortBy, boolean ascending) {
Sort sort = ascending ? Sort.by(sortBy).ascending() : Sort.by(sortBy).descending();
Pageable pageable = PageRequest.of(page, size, sort);
return employeeRepository.findAll(pageable);
}
}
এখানে:
- PageRequest.of(page, size, sort): এটি pagination এবং sorting একত্রে কনফিগার করে। এখানে
pageহলো যে পৃষ্ঠায় আপনি ডেটা দেখতে চান এবংsizeহলো পৃষ্ঠায় কতটি রেকর্ড দেখতে চান।sortByহলো সেই কলাম, যার ওপর ভিত্তি করে ডেটা সাজানো হবে এবংascendingহলো ডেটা সাজানোর অর্ডার (ascending বা descending)। - findAll(pageable): এটি repository থেকে pagination এবং sorting সহ ডেটা ফেচ করে।
4. Controller Layer
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.data.domain.Page;
@RestController
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
// Endpoint to get paginated and sorted employees
@GetMapping("/employees")
public Page<Employee> getEmployees(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "5") int size,
@RequestParam(defaultValue = "name") String sortBy,
@RequestParam(defaultValue = "true") boolean ascending) {
return employeeService.getEmployeesPaginatedAndSorted(page, size, sortBy, ascending);
}
}
এখানে:
/employeesAPI এর মাধ্যমে আমরা পৃষ্ঠাভিত্তিক ডেটা এবং সোর্টিং কনফিগার করতে পারি।@RequestParamব্যবহার করে ইউজার থেকে পেজ নম্বর, সাইজ, সোর্টিং কলাম এবং অর্ডার প্যারামিটার নেওয়া হচ্ছে।
5. Example Output
যদি আপনি URL এ /employees?page=1&size=5&sortBy=salary&ascending=false পাঠান, তাহলে এটি দ্বিতীয় পৃষ্ঠা থেকে ৫টি কর্মচারী রেকর্ড নিয়ে আসবে, যাদের বেতন descending অর্ডারে সাজানো থাকবে।
JSON Output (Example):
{
"content": [
{
"id": 1,
"name": "John Doe",
"salary": 75000.0
},
{
"id": 2,
"name": "Jane Smith",
"salary": 68000.0
},
{
"id": 3,
"name": "Tom Brown",
"salary": 60000.0
},
{
"id": 4,
"name": "Emma White",
"salary": 58000.0
},
{
"id": 5,
"name": "Michael Green",
"salary": 55000.0
}
],
"pageable": {
"sort": {
"unsorted": false,
"sorted": true,
"empty": false
},
"pageSize": 5,
"pageNumber": 1,
"offset": 5,
"unpaged": false,
"paged": true
},
"totalPages": 3,
"totalElements": 15,
"last": false,
"size": 5,
"number": 1,
"sort": {
"sorted": true,
"unsorted": false,
"empty": false
},
"first": false,
"numberOfElements": 5,
"empty": false
}
এখানে:
- content: পৃষ্ঠায় প্রদর্শিত ডেটার তালিকা।
- totalPages: মোট পৃষ্ঠার সংখ্যা।
- totalElements: মোট রেকর্ডের সংখ্যা।
- size: প্রতি পৃষ্ঠায় রেকর্ডের সংখ্যা।
- sort: ডেটার সোর্টিং তথ্য।
সারাংশ
JPA Pagination এবং Sorting ডেটার বড় সেটের সাথে কাজ করার সময় কার্যকারিতা এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে সহায়তা করে। Pageable এবং Sort ক্লাস ব্যবহার করে Spring Data JPA তে সহজেই pagination এবং sorting কার্যকর করা যায়। JPA Pagination ডেটা এক্সট্র্যাক্ট করার জন্য setFirstResult() এবং setMaxResults() মেথড ব্যবহার করে, আর Sorting ডেটাকে OrderBy ক্লজ বা Sort ক্লাসের মাধ্যমে সাজানো যায়।
এটি ডেটাবেস থেকে বড় পরিমাণ ডেটা টেনে আনার সময় প্রয়োজনীয় তথ্য ফেচ করে, সঠিক ভাবে সাজিয়ে এবং পৃষ্ঠা অনুযায়ী লোড করে, যাতে সিস্টেমে কর্মক্ষমতা বজায় থাকে এবং ব্যবহারকারী ডেটা সহজে দেখতে পারে।
Read more