JPA (Java Persistence API) এর Criteria API ডেভেলপারদের জন্য একটি টাইপ-সেফ, প্ল্যাটফর্ম-নিরপেক্ষ উপায় প্রদান করে, যার মাধ্যমে JPQL (Java Persistence Query Language) ব্যবহার না করে ডাইনামিকভাবে ডেটাবেস কুয়েরি তৈরি করা যায়। CriteriaQuery, CriteriaBuilder, এবং Root ক্লাসগুলি Criteria API এর একটি গুরুত্বপূর্ণ অংশ।
এই ক্লাসগুলির সাহায্যে ডেটাবেস কুয়েরি তৈরি এবং এক্সিকিউট করা যায় যা আরও টাইপ-সেফ, এবং কোডে এক্সপ্রেশন অ্যানালাইসিসের মাধ্যমে ডাইনামিক কোয়েরি তৈরি করতে সহায়তা করে।
১. CriteriaBuilder ক্লাস
CriteriaBuilder ক্লাসটি CriteriaQuery তৈরি করার জন্য ব্যবহৃত হয় এবং JPA কুয়েরি শর্তাবলী (conditions) তৈরি করার জন্য একটি সাধারণ API প্রদান করে।
- CriteriaBuilder ক্লাসে criteria(), equal(), like(), greaterThan(), lessThan() ইত্যাদি মেথড রয়েছে, যা ব্যবহার করে আপনি কুয়েরি তৈরির শর্তাবলী (conditions) সংজ্ঞায়িত করতে পারেন।
CriteriaBuilder উদাহরণ:
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import java.util.List;
public class CriteriaBuilderExample {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJpaUnit");
EntityManager em = emf.createEntityManager();
// Create CriteriaBuilder instance
CriteriaBuilder cb = em.getCriteriaBuilder();
// Create CriteriaQuery instance
CriteriaQuery<Person> cq = cb.createQuery(Person.class);
// Define the root (the entity class)
Root<Person> root = cq.from(Person.class);
// Define the condition (where clause)
cq.select(root).where(cb.equal(root.get("age"), 30));
// Execute the query
TypedQuery<Person> query = em.createQuery(cq);
List<Person> results = query.getResultList();
// Output the results
for (Person person : results) {
System.out.println(person.getName() + " - " + person.getAge());
}
em.close();
emf.close();
}
}
Explanation:
- CriteriaBuilder:
em.getCriteriaBuilder()ব্যবহার করে CriteriaBuilder ইনস্ট্যান্স তৈরি করা হয়। - Root:
Root<Person> root = cq.from(Person.class);এখানেPersonEntity ক্লাসের রুট ডিফাইন করা হচ্ছে। - CriteriaQuery: CriteriaQuery ব্যবহার করে একটি কুয়েরি তৈরি করা হয় যেখানে
select(root)এর মাধ্যমে রিটার্ন করার জন্য Person অবজেক্ট নির্বাচন করা হয়। - where():
cb.equal(root.get("age"), 30)শর্তের মাধ্যমেage৩০ এর সমান এমন সব ব্যক্তি পাওয়া যাবে।
২. CriteriaQuery ক্লাস
CriteriaQuery ক্লাস Criteria API তে কুয়েরি তৈরি এবং পরিচালনা করার জন্য ব্যবহৃত হয়। এটি মূলত SELECT কুয়েরি তৈরি করার জন্য ব্যবহৃত হয় এবং এতে ডাইনামিক কুয়েরি তৈরি করার জন্য শর্তাবলী সংজ্ঞায়িত করা হয়।
CriteriaQuery উদাহরণ:
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import java.util.List;
public class CriteriaQueryExample {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJpaUnit");
EntityManager em = emf.createEntityManager();
// Create CriteriaQuery instance
CriteriaQuery<Person> cq = em.getCriteriaBuilder().createQuery(Person.class);
// Define the root (the entity class)
Root<Person> root = cq.from(Person.class);
// Define the select part (selecting all persons)
cq.select(root);
// Execute the query
TypedQuery<Person> query = em.createQuery(cq);
List<Person> results = query.getResultList();
// Output the results
for (Person person : results) {
System.out.println(person.getName() + " - " + person.getAge());
}
em.close();
emf.close();
}
}
Explanation:
- CriteriaQuery:
CriteriaQuery<Person> cq = em.getCriteriaBuilder().createQuery(Person.class);এটি CriteriaQuery এর ইনস্ট্যান্স তৈরি করছে যা Person Entity ক্লাসের জন্য। - Root:
Root<Person> root = cq.from(Person.class);এই অংশে Person ক্লাস থেকে রুট অবজেক্ট তৈরি করা হচ্ছে। - select(): কুয়েরির মাধ্যমে
cq.select(root)সকল Person অবজেক্ট নির্বাচন করা হচ্ছে।
৩. Root ক্লাস
Root ক্লাস JPA Criteria API-তে একটি Entity ক্লাসের সাথে সম্পর্কিত রুট অবজেক্ট প্রতিনিধিত্ব করে। এটি ডেটাবেস টেবিলের জন্য FROM ক্লজের মতো কাজ করে এবং Entity ক্লাসের প্রপার্টি অ্যাক্সেস করার জন্য ব্যবহার করা হয়।
Root উদাহরণ:
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import java.util.List;
public class RootExample {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJpaUnit");
EntityManager em = emf.createEntityManager();
// Create CriteriaBuilder and CriteriaQuery instances
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Person> cq = cb.createQuery(Person.class);
// Define the root (the entity class)
Root<Person> root = cq.from(Person.class);
// Select all persons
cq.select(root);
// Execute the query
TypedQuery<Person> query = em.createQuery(cq);
List<Person> results = query.getResultList();
// Output the results
for (Person person : results) {
System.out.println(person.getName() + " - " + person.getAge());
}
em.close();
emf.close();
}
}
Explanation:
- Root:
Root<Person> root = cq.from(Person.class);এখানে Person Entity ক্লাসের রুট অবজেক্ট তৈরি করা হচ্ছে, যা Criteria API তেFROMক্লজের কাজ করে। - cq.select(root): এখানে select মেথডের মাধ্যমে Person টেবিলের সব রেকর্ড সিলেক্ট করা হয়েছে।
৪. Criteria API ব্যবহার করে ডাইনামিক কুয়েরি তৈরি
JPA Criteria API দিয়ে আপনি ডাইনামিক কুয়েরি তৈরি করতে পারেন, যেমন WHERE, ORDER BY, এবং JOIN শর্তগুলি যোগ করা। এতে SQL কুয়েরি লেখা ছাড়াই ডেটাবেস কুয়েরি তৈরি করা সম্ভব।
ডাইনামিক WHERE শর্ত (Dynamic WHERE Clause Example)
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import java.util.List;
public class DynamicWhereClauseExample {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJpaUnit");
EntityManager em = emf.createEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Person> cq = cb.createQuery(Person.class);
Root<Person> root = cq.from(Person.class);
// Dynamic condition: Where age > 30
Predicate agePredicate = cb.greaterThan(root.get("age"), 30);
cq.where(agePredicate);
TypedQuery<Person> query = em.createQuery(cq);
List<Person> results = query.getResultList();
// Output the results
for (Person person : results) {
System.out.println(person.getName() + " - " + person.getAge());
}
em.close();
emf.close();
}
}
Explanation:
- Predicate:
cb.greaterThan(root.get("age"), 30)এখানে age প্রপার্টির জন্য একটি শর্ত তৈরি করা হয়েছে, যা কেবল age > 30 কন্ডিশন প্রাপ্ত রেকর্ডগুলো সিলেক্ট করবে।
সারাংশ
JPA Criteria API একটি শক্তিশালী টুল যা CriteriaQuery, CriteriaBuilder, এবং Root ক্লাসের মাধ্যমে ডাইনামিক এবং টাইপ-সেফ SQL কুয়েরি তৈরি করতে সাহায্য করে। এই API ব্যবহার করে আপনি ডেটাবেস কুয়েরি তৈরি করতে পারেন যা SQL কুয়েরির তুলনায় আরও নিরাপদ এবং প্ল্যাটফর্ম নিরপেক্ষ হয়। CriteriaBuilder ব্যবহার করে কুয়েরির শর্ত তৈরি, Root ব্যবহার করে Entity ক্লাসের প্রপার্টি অ্যাক্সেস এবং CriteriaQuery ব্যবহার করে ডাইনামিক কুয়েরি তৈরি করা হয়, যা JPA ডেটাবেস অপারেশনকে আরও কার্যকরী এবং নমনীয় করে তোলে।
Read more