JPA Criteria API হলো একটি শক্তিশালী ফিচার যা ডাইনামিক কুয়েরি তৈরি করতে সাহায্য করে। SQL বা JPQL কোডের মতো স্ট্রিং ব্যবহার না করে Criteria API ব্যবহার করে কুয়েরি তৈরি করা হয়। এটি ট্যাইপ সেফ, ডাইনামিক এবং আরও ফ্লেক্সিবল কুয়েরি লেখার জন্য ব্যবহৃত হয়।
Criteria API এর সাহায্যে আপনি ডাইনামিক কুয়েরি তৈরি করতে পারেন যেগুলি runtime এ তৈরি হয়, যা SQL বা JPQL কুয়েরির তুলনায় আরো ভালো।
Criteria API এর সুবিধা
- Type-safe: কোড লেখার সময় আপনি অটো কমপ্লিশন, টাইপ চেকিং এবং ইরর হ্যান্ডলিং এর সুবিধা পাবেন।
- Dynamic Queries: runtime এ কুয়েরি তৈরি এবং ইভ্যালুয়েট করা সম্ভব।
- Reuse: একাধিক কুয়েরি তৈরি এবং পুনঃব্যবহার করা সহজ।
- Maintainability: কোড আরও পরিষ্কার এবং বজায় রাখা সহজ হয়, বিশেষ করে জটিল কুয়েরি লেখার সময়।
১. Criteria API Setup:
Criteria API ব্যবহার করার জন্য CriteriaBuilder, CriteriaQuery, এবং Root ক্লাসগুলো ব্যবহার করা হয়।
Criteria API এর মৌলিক স্টেপস:
- CriteriaBuilder: এটি Criteria API এর মাধ্যমে কুয়েরি তৈরি করতে ব্যবহৃত হয়।
- CriteriaQuery: এটি কুয়েরি কাঠামো ধারণ করে।
- Root: এটি Entity ক্লাসের জন্য root অবজেক্ট তৈরি করে।
২. Criteria API Example: Basic Query
ধরা যাক আমাদের একটি Person Entity রয়েছে এবং আমরা Criteria API ব্যবহার করে ডাইনামিক কুয়েরি তৈরি করতে চাই। এখানে আমরা একটি সহজ উদাহরণ দেখাবো যেখানে Person Entity তে নির্দিষ্ট বয়সের বেশি ব্যবহারকারীদের নাম এবং বয়স রিট্রিভ করা হবে।
Person Entity Class:
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Person {
@Id
private Long id;
private String name;
private int age;
// Getters and Setters
}
Criteria API Example - Basic Query:
import javax.persistence.*;
import javax.persistence.criteria.*;
import java.util.List;
public class CriteriaApiExample {
public static void main(String[] args) {
// Create EntityManagerFactory and EntityManager
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJPAUnit");
EntityManager em = emf.createEntityManager();
// Start the transaction
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Person> cq = cb.createQuery(Person.class);
// Root of the query (person table)
Root<Person> personRoot = cq.from(Person.class);
// Select from Person where age > 30
cq.select(personRoot).where(cb.greaterThan(personRoot.get("age"), 30));
// Execute the query and get results
TypedQuery<Person> query = em.createQuery(cq);
List<Person> results = query.getResultList();
// Display results
for (Person person : results) {
System.out.println("Name: " + person.getName() + ", Age: " + person.getAge());
}
// Close EntityManager and EntityManagerFactory
em.close();
emf.close();
}
}
Explanation:
- CriteriaBuilder:
cbহলো CriteriaBuilder অবজেক্ট, যা কুয়েরি তৈরি করতে ব্যবহৃত হয়। - CriteriaQuery:
cqহলো CriteriaQuery অবজেক্ট যা কুয়েরির কাঠামো ধারণ করে। - Root:
personRootহলোPersonEntity এর জন্য root অবজেক্ট। - Predicate:
cb.greaterThan()ব্যবহার করে বয়স ৩০ এর বেশি এমন রেকর্ড বের করা হয়।
৩. Dynamic Queries with Criteria API
এখন, আমরা দেখব কিভাবে Criteria API ব্যবহার করে ডাইনামিক কুয়েরি তৈরি করা যায়। এটি ডাইনামিকভাবে কুয়েরি শর্ত (conditions) যোগ করার জন্য উপযুক্ত।
Dynamic Criteria API Example:
ধরা যাক, আমরা একটি ডাইনামিক কুয়েরি তৈরি করতে চাই যেখানে ব্যবহারকারীর নাম এবং বয়স ফিল্টার করা যাবে, এবং এই ফিল্টারগুলো runtime এ নির্ধারণ করা হবে।
import javax.persistence.*;
import javax.persistence.criteria.*;
import java.util.List;
public class DynamicCriteriaExample {
public static void main(String[] args) {
// Create EntityManagerFactory and EntityManager
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJPAUnit");
EntityManager em = emf.createEntityManager();
// Start the transaction
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Person> cq = cb.createQuery(Person.class);
// Root of the query (person table)
Root<Person> personRoot = cq.from(Person.class);
// Build dynamic conditions
Predicate finalPredicate = cb.conjunction(); // Start with a true condition (AND)
// Example dynamic condition 1: Filter by age (if condition is met)
Integer minAge = 30;
if (minAge != null) {
finalPredicate = cb.and(finalPredicate, cb.greaterThan(personRoot.get("age"), minAge));
}
// Example dynamic condition 2: Filter by name (if condition is met)
String namePattern = "John";
if (namePattern != null && !namePattern.isEmpty()) {
finalPredicate = cb.and(finalPredicate, cb.like(personRoot.get("name"), "%" + namePattern + "%"));
}
// Apply conditions to the query
cq.where(finalPredicate);
// Execute the query and get results
TypedQuery<Person> query = em.createQuery(cq);
List<Person> results = query.getResultList();
// Display results
for (Person person : results) {
System.out.println("Name: " + person.getName() + ", Age: " + person.getAge());
}
// Close EntityManager and EntityManagerFactory
em.close();
emf.close();
}
}
Explanation:
- Dynamic Predicate: এখানে
cb.conjunction()ব্যবহার করা হয়েছে, যা প্রথমে একটি TRUE শর্ত তৈরি করে এবং পরে ডাইনামিকভাবে অন্যান্য শর্ত যোগ করা হয়। - Dynamic Filtering: আমরা age এবং name এর উপর ডাইনামিক ফিল্টার যোগ করেছি, এবং শুধুমাত্র তখনই শর্তগুলি কার্যকর হয় যখন তাদের মান দেয়া থাকে।
- Predicate: এটি
ANDঅপারেটর হিসেবে কাজ করে, অর্থাৎ দুটি শর্ত একসাথে মিলিয়ে কাজ করবে।
৪. Criteria API এর অন্যান্য কার্যকরী ফিচার
Criteria API ব্যবহারের সময়, আপনি আরও অনেক কার্যকরী ফিচার ব্যবহার করতে পারেন যেমন:
- Ordering (Sorting): ডেটাকে ক্রম (ascending/descending) অনুযায়ী সাজানো।
- GroupBy: গ্রুপিং করতে পারেন নির্দিষ্ট কলামের উপর ভিত্তি করে।
- Aggregation: COUNT, SUM, AVG ইত্যাদি অগ্রিগেট ফাংশন ব্যবহার করতে পারেন।
Criteria API with Sorting (Ordering) Example:
CriteriaQuery<Person> cq = cb.createQuery(Person.class);
Root<Person> personRoot = cq.from(Person.class);
// Sort by name in ascending order
cq.orderBy(cb.asc(personRoot.get("name")));
TypedQuery<Person> query = em.createQuery(cq);
List<Person> results = query.getResultList();
for (Person person : results) {
System.out.println("Name: " + person.getName());
}
Criteria API with Aggregation Example:
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
Root<Person> personRoot = cq.from(Person.class);
cq.select(cb.count(personRoot)); // Count the number of persons
TypedQuery<Long> query = em.createQuery(cq);
Long result = query.getSingleResult();
System.out.println("Total Persons: " + result);
সারাংশ
JPA Criteria API ডাইনামিক কুয়েরি তৈরি করার জন্য একটি শক্তিশালী এবং টাইপ সেফ উপায় প্রদান করে। এটি ডেভেলপারদেরকে ডাইনামিকভাবে কুয়েরি কন্ডিশন তৈরি করার সুযোগ দেয় এবং কোডিং এর সময় টাইপ চেকিং ও সঠিকতা নিশ্চিত করে।
- Criteria API ব্যবহার করে আপনি ডাইনামিক ফিল্টারিং, সটিং, গ্রুপিং এবং অগ্রিগেটিং সহজেই করতে পারেন।
- Criteria API দিয়ে JPA কুয়েরি লেখার সময় SQL বা JPQL এর সাথে তুলনামূলকভাবে কমপ্লেক্স এবং টাইপ সেফ কুয়েরি লেখা যায়।
Read more