Restrictions এবং Projections Hibernate এর দুটি শক্তিশালী ফিচার, যা Criteria API ব্যবহার করে queries তৈরি করতে সহায়ক। এগুলি ডেটা রিট্রিভ করার প্রক্রিয়া আরও ফ্লেক্সিবল এবং কার্যকরী করতে ব্যবহৃত হয়, বিশেষ করে যখন আপনাকে complex filtering বা specific fields চয়ন করতে হয়।
এই অংশে Restrictions এবং Projections কীভাবে কাজ করে এবং তাদের ব্যবহার কীভাবে ডেটা রিট্রিভাল অপটিমাইজ করতে সাহায্য করে তা আলোচনা করা হবে।
1. Restrictions
Restrictions Hibernate Criteria API-তে queries কাস্টমাইজ করার জন্য ব্যবহৃত হয়। এটি filtering এবং conditional expressions এর মাধ্যমে ডেটা সংগ্রহের জন্য অত্যন্ত কার্যকর। Restrictions ব্যবহার করে আপনি where conditions, like, between, equals, ইত্যাদি বিভিন্ন ধরনের শর্ত ব্যবহার করতে পারেন।
Common Restrictions:
- eq (Equal)
- ne (Not Equal)
- like (Pattern Matching)
- between (Range Filtering)
- gt, lt, ge, le (Greater Than, Less Than, Greater or Equal, Less or Equal)
- isNull, isNotNull (Null Check)
Example: Using Restrictions to Filter Data
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;
import java.util.List;
public class RetrieveExample {
public static void main(String[] args) {
// Step 1: Create session factory and session
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
.addAnnotatedClass(Employee.class)
.buildSessionFactory();
Session session = factory.getCurrentSession();
try {
// Step 2: Begin transaction
session.beginTransaction();
// Step 3: Use Criteria to apply Restrictions (filter employees with salary greater than 50000)
List<Employee> employees = session.createCriteria(Employee.class)
.add(Restrictions.gt("salary", 50000))
.list();
// Step 4: Display the results
for (Employee emp : employees) {
System.out.println(emp);
}
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
Explanation:
Restrictions.gt("salary", 50000): এই restrictionsalaryফিল্ডের জন্য একটি শর্ত তৈরি করে যা50000এর চেয়ে বড় মান রিটার্ন করবে।createCriteria(Employee.class): এটিEmployeeক্লাসের উপর একটি Criteria query তৈরি করে।
2. Projections
Projections Hibernate Criteria API-তে ব্যবহার করা হয়, যখন আপনি specific fields (columns) বা aggregated results (যেমন COUNT, SUM) রিটার্ন করতে চান। Projection মূলত SQL-এর SELECT কুয়েরি অংশের মতো কাজ করে, যার মাধ্যমে আপনি কোন ফিল্ড বা ডেটা রিটার্ন করবেন তা নিয়ন্ত্রণ করতে পারেন।
Common Projections:
- property: একটি নির্দিষ্ট প্রপার্টি (ফিল্ড) রিটার্ন করতে ব্যবহার করা হয়।
- rowCount: মোট রেকর্ডের সংখ্যা জানতে।
- sum, avg, min, max: ডেটার গাণিতিক পরিসংখ্যান বের করার জন্য।
Example: Using Projections to Select Specific Fields
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Projections;
import java.util.List;
public class RetrieveExample {
public static void main(String[] args) {
// Step 1: Create session factory and session
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
.addAnnotatedClass(Employee.class)
.buildSessionFactory();
Session session = factory.getCurrentSession();
try {
// Step 2: Begin transaction
session.beginTransaction();
// Step 3: Using Projections to retrieve only "name" and "salary" columns
List<Object[]> results = session.createCriteria(Employee.class)
.setProjection(Projections.projectionList()
.add(Projections.property("name"))
.add(Projections.property("salary")))
.list();
// Step 4: Display the results
for (Object[] result : results) {
System.out.println("Employee Name: " + result[0] + ", Salary: " + result[1]);
}
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
Explanation:
Projections.property("name"): এটি শুধুমাত্রnameফিল্ডটি রিটার্ন করার জন্য ব্যবহৃত হয়।Projections.property("salary"): এটিsalaryফিল্ডের মান রিটার্ন করে।setProjection(Projections.projectionList()): এটি একাধিক ফিল্ড নির্বাচন করার জন্য ব্যবহৃত হয়।
3. Using Projections with Aggregation Functions
Projections শুধুমাত্র একক ফিল্ড বা ডেটা রিটার্ন করতে নয়, বরং aggregation functions (যেমন COUNT, SUM, AVG, MIN, MAX) হিসাব করতে সাহায্য করে।
Example: Using Projections for Aggregation (SUM, COUNT)
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Projections;
public class RetrieveExample {
public static void main(String[] args) {
// Step 1: Create session factory and session
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
.addAnnotatedClass(Employee.class)
.buildSessionFactory();
Session session = factory.getCurrentSession();
try {
// Step 2: Begin transaction
session.beginTransaction();
// Step 3: Use Projections to calculate the total salary of all employees
Double totalSalary = (Double) session.createCriteria(Employee.class)
.setProjection(Projections.sum("salary"))
.uniqueResult();
System.out.println("Total Salary: " + totalSalary);
// Step 4: Use Projections to count the number of employees
Long employeeCount = (Long) session.createCriteria(Employee.class)
.setProjection(Projections.rowCount())
.uniqueResult();
System.out.println("Total Employees: " + employeeCount);
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
Explanation:
Projections.sum("salary"): এটি সমস্তsalaryফিল্ডের মোট যোগফল রিটার্ন করবে।Projections.rowCount(): এটি টেবিলের মোট রেকর্ড (কাউন্ট) রিটার্ন করবে।
4. Combining Restrictions and Projections
Hibernate Criteria API-তে Restrictions এবং Projections একসাথে ব্যবহার করা সম্ভব, যেখানে আপনি একদিকে শর্ত আরোপ (filtering) করবেন এবং অন্যদিকে নির্দিষ্ট ফিল্ড বা অ্যাগ্রিগেটেড ভ্যালু রিটার্ন করবেন।
Example: Using Restrictions and Projections Together
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.Projections;
public class RetrieveExample {
public static void main(String[] args) {
// Step 1: Create session factory and session
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
.addAnnotatedClass(Employee.class)
.buildSessionFactory();
Session session = factory.getCurrentSession();
try {
// Step 2: Begin transaction
session.beginTransaction();
// Step 3: Use Restrictions and Projections together
List<Object[]> results = session.createCriteria(Employee.class)
.add(Restrictions.gt("salary", 30000))
.setProjection(Projections.projectionList()
.add(Projections.property("name"))
.add(Projections.property("salary")))
.list();
// Step 4: Display the results
for (Object[] result : results) {
System.out.println("Employee Name: " + result[0] + ", Salary: " + result[1]);
}
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
Explanation:
Restrictions.gt("salary", 30000): এখানেsalaryএর মান ৩০,০০০ এর চেয়ে বড় হওয়া উচিত।Projections.property("name")এবংProjections.property("salary"): এখানেnameএবংsalaryরিটার্ন করা হচ্ছে যেগুলিsalary > 30000শর্তে ফিল্টার করা হয়েছে।
Hibernate Criteria API-তে Restrictions এবং Projections ব্যবহারের মাধ্যমে আপনি ডেটা ফিল্টার এবং কাস্টমাইজ করতে পারেন। এই দুই ফিচারের মাধ্যমে:
- Restrictions আপনাকে ডেটা রিট্রিভ করার জন্য শর্ত এবং ফিল্টার অ্যাপ্লাই করতে সাহায্য করে (যেমন,
like,equal,greaterThan, ইত্যাদি)। - Projections আপনাকে নির্দিষ্ট ফিল্ড বা অ্যাগ্রিগেটেড রেজাল্ট (যেমন,
COUNT,SUM,AVG) রিটার্ন করতে সাহায্য করে।
এই দুটি ফিচারের সঠিক ব্যবহার আপনার কোডকে আরও কার্যকরী, নমনীয় এবং পারফরম্যান্স অপটিমাইজড করতে সাহায্য করবে।
Read more