Hibernate Criteria API হল একটি শক্তিশালী উপায় যার মাধ্যমে ডাইনামিক কুয়েরি তৈরি করা যায়। এটি Hibernate ORM ফ্রেমওয়ার্কে Object-Oriented কোড লিখে SQL কুয়েরি তৈরি করতে সহায়তা করে। Criteria API আপনাকে Type-safe, dynamic queries, এবং complex queries তৈরির সুবিধা প্রদান করে, যেখানে আপনি JPA-এর CriteriaBuilder এবং CriteriaQuery ব্যবহার করে কোডের মাধ্যমে কুয়েরি তৈরি করতে পারেন।
Criteria API: Overview
Criteria API হাইবারনেট 3.x-এ তৈরি হয়েছিল এবং এটি JPA (Java Persistence API) স্পেসিফিকেশনের অংশ হিসেবে JPA Criteria API হিসেবে উন্নত করা হয়েছে। Hibernate Criteria API মূলত ডাইনামিক কুয়েরি তৈরি করতে ব্যবহৃত হয়, যেখানে আপনার কুয়েরি প্রোগ্রাম্যাটিকভাবে তৈরি করা হয় এবং type-safe থাকে।
Advantages of Criteria API:
- Type-Safe Queries: Type checking at compile time.
- Dynamic Queries: You can build queries dynamically based on conditions.
- More Readable and Maintainable: Easier to maintain and debug.
- Avoid SQL Injection: Safe from SQL injection attacks as it avoids concatenating raw strings.
1. Setting Up Hibernate Criteria API
Entity Class Example (Student):
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Student {
@Id
private int id;
private String name;
private String course;
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCourse() {
return course;
}
public void setCourse(String course) {
this.course = course;
}
}
2. Example: Basic Query Using Criteria API
Basic Query to get all students:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.query.Query;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import java.util.List;
public class CriteriaExample {
public static void main(String[] args) {
SessionFactory factory = HibernateUtil.getSessionFactory();
Session session = factory.getCurrentSession();
try {
session.beginTransaction();
// Create a Criteria instance
Criteria criteria = session.createCriteria(Student.class);
// Execute the query and get the list of students
List<Student> students = criteria.list();
for (Student student : students) {
System.out.println(student.getName() + ": " + student.getCourse());
}
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
In this example, the Criteria object retrieves all students from the Student table. The query is simple and fetches all records.
3. Using Restrictions for Filtering Criteria
You can use Restrictions to add conditions to your query (similar to WHERE in SQL).
Example: Filter Students by Course
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import java.util.List;
public class CriteriaExample {
public static void main(String[] args) {
SessionFactory factory = HibernateUtil.getSessionFactory();
Session session = factory.getCurrentSession();
try {
session.beginTransaction();
// Create a Criteria instance
Criteria criteria = session.createCriteria(Student.class);
// Apply restriction to filter students by course
criteria.add(Restrictions.eq("course", "Java")); // Similar to WHERE course='Java'
// Execute the query and get the list of students
List<Student> students = criteria.list();
for (Student student : students) {
System.out.println(student.getName() + ": " + student.getCourse());
}
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
In this example:
Restrictions.eq()is used to filter students whose course is "Java".
4. Using Multiple Restrictions for Complex Queries
You can combine multiple restrictions (conditions) using Restrictions.and() or Restrictions.or().
Example: Filter Students by Course and Name
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import java.util.List;
public class CriteriaExample {
public static void main(String[] args) {
SessionFactory factory = HibernateUtil.getSessionFactory();
Session session = factory.getCurrentSession();
try {
session.beginTransaction();
// Create a Criteria instance
Criteria criteria = session.createCriteria(Student.class);
// Apply multiple restrictions (AND condition)
criteria.add(Restrictions.eq("course", "Java"));
criteria.add(Restrictions.like("name", "John%")); // Name starts with John
// Execute the query and get the list of students
List<Student> students = criteria.list();
for (Student student : students) {
System.out.println(student.getName() + ": " + student.getCourse());
}
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
In this example:
Restrictions.like()is used to filter students whose names start with "John".- Multiple restrictions are applied with an implicit AND.
5. Sorting Results Using Criteria API
You can easily sort the results using Order.
Example: Sorting Students by Name
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import java.util.List;
public class CriteriaExample {
public static void main(String[] args) {
SessionFactory factory = HibernateUtil.getSessionFactory();
Session session = factory.getCurrentSession();
try {
session.beginTransaction();
// Create a Criteria instance
Criteria criteria = session.createCriteria(Student.class);
// Sort the students by name in ascending order
criteria.addOrder(Order.asc("name"));
// Execute the query and get the list of students
List<Student> students = criteria.list();
for (Student student : students) {
System.out.println(student.getName() + ": " + student.getCourse());
}
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
In this example:
Order.asc("name")sorts the results by student name in ascending order.
6. Paginate Results Using Criteria API
You can also paginate results using setFirstResult() and setMaxResults().
Example: Pagination
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Criteria;
import java.util.List;
public class CriteriaExample {
public static void main(String[] args) {
SessionFactory factory = HibernateUtil.getSessionFactory();
Session session = factory.getCurrentSession();
try {
session.beginTransaction();
// Create a Criteria instance
Criteria criteria = session.createCriteria(Student.class);
// Set pagination parameters (page 1 with 5 records per page)
criteria.setFirstResult(0);
criteria.setMaxResults(5);
// Execute the query and get the list of students
List<Student> students = criteria.list();
for (Student student : students) {
System.out.println(student.getName() + ": " + student.getCourse());
}
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
In this example:
setFirstResult(0): This sets the first record to fetch (start at the first record).setMaxResults(5): This limits the number of records to 5.
7. Dynamic Queries Using Criteria API
You can dynamically build queries based on conditions, allowing for flexible and reusable code.
Example: Dynamic Query Creation
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import java.util.List;
public class CriteriaExample {
public static void main(String[] args) {
SessionFactory factory = HibernateUtil.getSessionFactory();
Session session = factory.getCurrentSession();
try {
session.beginTransaction();
// Create a Criteria instance
Criteria criteria = session.createCriteria(Student.class);
// Dynamically add restrictions
String course = "Java"; // Can be dynamically set
if (course != null && !course.isEmpty()) {
criteria.add(Restrictions.eq("course", course));
}
// Execute the query and get the list of students
List<Student> students = criteria.list();
for (Student student : students) {
System.out.println(student.getName() + ": " + student.getCourse());
}
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
Here, the query is dynamically adjusted based on the condition, which makes it flexible for use in various scenarios.
Hibernate Criteria API একটি শক্তিশালী এবং type-safe উপায়, যা dynamic queries তৈরি করতে সাহায্য করে। এর মাধ্যমে আপনি complex queries তৈরি করতে পারেন এবং filters, sorting, pagination সহ বিভিন্ন কার্যক্রম পরিচালনা করতে পারেন। Criteria API ব্যবহার করলে SQL-এর মতো কুয়েরি লিখতে হয় না, এবং কোড লিখতে অনেক বেশি সুবিধা হয় কারণ এটি type-safe এবং compile-time checking প্রদান করে।
Read more