Criteria API JPA (Java Persistence API) এর একটি শক্তিশালী ফিচার যা ডাইনামিক এবং টাইপ-সেফ (type-safe) কোয়েরি তৈরি করার জন্য ব্যবহৃত হয়। এটি JPQL (Java Persistence Query Language) বা SQL এর পরিবর্তে Java কোডের মাধ্যমে ডেটাবেসে কোয়েরি তৈরি করতে সহায়তা করে। Criteria API কোডের মধ্যে ডাইনামিকভাবে কোয়েরি তৈরি করার সুবিধা প্রদান করে, যা SQL বা JPQL লেখার তুলনায় বেশি নিরাপদ, রিডেবল এবং পরিবর্তনযোগ্য।
Criteria API কী এবং কীভাবে কাজ করে?
Criteria API JPA-তে টাইপ-সেফ কোয়েরি তৈরি করার জন্য ব্যবহার করা হয়। এর মাধ্যমে আপনি Java কোডে ডেটাবেসের জন্য কোয়েরি তৈরি করতে পারেন, যা ডেটাবেস স্ট্রাকচার এবং অবজেক্ট মডেলকে যথাযথভাবে ব্যবহার করে। Criteria API জেনেরিক প্রোগ্রামিং ধারণা ব্যবহার করে এবং এতে ডেটাবেস অপারেশন সহজে করা যায়।
Criteria API কোয়েরি তৈরি করার সময় Java classes এবং JPA entities এর সাথে কাজ করা হয়, যেহেতু কোয়েরি প্রক্রিয়া Java objects এবং properties এর মাধ্যমে করা হয়। এর মাধ্যমে কোয়েরি ফিল্টার, প্যারামিটারাইজড কোয়েরি, অর্ডারিং এবং গ্রুপিং করা যায়।
Criteria API এর সুবিধা
- টাইপ-সেফ কোয়েরি: Criteria API কোয়েরি লেখার সময় টাইপ-সেফ (type-safe) হয়, অর্থাৎ কোড কম্পাইল হওয়া পর্যন্ত কোনো টাইপ বা সিনট্যাক্সের ত্রুটি থাকে না। এটি জাভা কোডের মধ্যে কোয়েরি তৈরি করতে সাহায্য করে, যেখানে টাইপ মিসম্যাচ বা ভুল কলামের নাম কম হয়।
- ডাইনামিক কোয়েরি তৈরি: Criteria API দিয়ে কোয়েরি কোডের মধ্যে ডাইনামিকভাবে তৈরি করা যায়। উদাহরণস্বরূপ, ইউজারের ইনপুট অনুযায়ী কোয়েরি ফিল্টার বা কন্ডিশন যোগ করা সম্ভব হয়।
- SQL এবং JPQL এর বিকল্প: JPQL বা SQL লেখার চাইতে Criteria API ব্যবহার করা অনেক বেশি সুবিধাজনক, কারণ এটি ডাইনামিক কোয়েরি লেখার সময় অটোমেটিক টাইপ চেকিং এবং ভুল কোড লেখার সম্ভাবনা কমিয়ে দেয়।
- ক্লিয়ার এবং রিডেবল কোড: Criteria API কোডের মাধ্যমে কোয়েরি তৈরি করা অনেক বেশি রিডেবল এবং সুনির্দিষ্ট হয়, যেহেতু কোডে ডাইনামিক অপ্রয়োজনীয় অংশ বাদ দেওয়া যায় এবং অবজেক্টের মাধ্যমে কোয়েরি তৈরি করা হয়।
- পরিবর্তনযোগ্য কোয়েরি: Criteria API এর মাধ্যমে কোয়েরি পরিবর্তন বা কাস্টমাইজ করা সহজ হয়। কারণ কোয়েরি একবার তৈরি করার পর আপনি কোয়েরিতে নতুন কন্ডিশন বা ফিল্টার যোগ করতে পারেন, যা JPQL বা SQL এর মাধ্যমে করার তুলনায় অনেক সহজ।
Criteria API দিয়ে কোয়েরি লেখার উদাহরণ
ডেটাবেস টেবিল: Person
ধরা যাক, আমাদের একটি Person Entity ক্লাস আছে যার ফিল্ডগুলো হলো id, name, এবং age।
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
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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Criteria API কোয়েরি উদাহরণ
Criteria API ব্যবহার করে Person টেবিল থেকে age 25 এর বেশি এমন সব Person রেকর্ড খুঁজে বের করা:
import javax.persistence.*;
import javax.persistence.criteria.*;
public class CriteriaAPIExample {
public static void main(String[] args) {
// EntityManagerFactory তৈরি করা
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJPAUnit");
EntityManager em = emf.createEntityManager();
// CriteriaBuilder তৈরি করা
CriteriaBuilder cb = em.getCriteriaBuilder();
// CriteriaQuery তৈরি করা
CriteriaQuery<Person> cq = cb.createQuery(Person.class);
// Root (From clause) তৈরি করা
Root<Person> personRoot = cq.from(Person.class);
// Where clause - age > 25
Predicate agePredicate = cb.gt(personRoot.get("age"), 25);
cq.where(agePredicate);
// Query execution
TypedQuery<Person> query = em.createQuery(cq);
List<Person> results = query.getResultList();
// Results প্রদর্শন করা
for (Person person : results) {
System.out.println("Person Name: " + person.getName() + ", Age: " + person.getAge());
}
em.close();
emf.close();
}
}
Explanation:
- CriteriaBuilder: এটি Criteria API এর মাধ্যমে কোয়েরি তৈরি করার জন্য ব্যবহৃত হয়।
- Root personRoot: এটি FROM ক্লজের জন্য ব্যবহৃত হয় যা ডেটাবেস টেবিলের ভিত্তি হিসেবে কাজ করে।
- Predicate agePredicate: এটি WHERE ক্লজে একটি শর্ত নির্ধারণ করে, যেমন
age > 25। - CriteriaQuery: এটি কোয়েরি তৈরি করে এবং তারপর TypedQuery এর মাধ্যমে সেটি চালানো হয়।
Criteria API তে আরও কিছু অপশন:
Order By: Criteria API ব্যবহার করে অর্ডারিং করা যায়:
cq.orderBy(cb.asc(personRoot.get("name"))); // Name এর অক্ষরের উপর Ascending অর্ডারProjection (Select specific fields): আপনি একটি নির্দিষ্ট ফিল্ডের মানও পেতে পারেন:
cq.select(personRoot.get("name"));Group By: Criteria API এর মাধ্যমে গ্রুপিং করা সম্ভব:
cq.groupBy(personRoot.get("age"));
Criteria API কেন প্রয়োজন?
- ডাইনামিক কোয়েরি নির্মাণ: Criteria API কোয়েরি ডাইনামিকভাবে তৈরি করতে সাহায্য করে, যা SQL বা JPQL এর মাধ্যমে সম্ভব নয়। এটি সেই ক্ষেত্রে কার্যকর যেখানে ইউজার ইনপুটের উপর ভিত্তি করে কোয়েরি তৈরি করতে হয়।
- টাইপ-সেফ কোয়েরি: Criteria API ব্যবহার করে কোডে টাইপ মিসম্যাচ বা ভুল কলাম নাম লেখার সম্ভাবনা কমে যায়, কারণ এটি Java objects এর মাধ্যমে কাজ করে।
- কমপ্লেক্স কোয়েরি সমাধান: JPA Criteria API জটিল কোয়েরি গঠন করতে সহায়তা করে, যেমন কন্ডিশন, অর্ডার, গ্রুপিং ইত্যাদি যোগ করা সহজ হয়।
- JPA ও ডেটাবেস ইন্টিগ্রেশন: Criteria API JPA এর সাথে ইন্টিগ্রেশন সহজ করে এবং এটি ডেটাবেস সিস্টেমের জন্য স্বাধীন। এটি SQL ডায়ালেক্টের উপর নির্ভর করে না।
সারাংশ
Criteria API JPA এর একটি শক্তিশালী ফিচার যা ডাইনামিক, টাইপ-সেফ এবং জটিল কোয়েরি তৈরি করার সুবিধা প্রদান করে। এটি SQL বা JPQL এর তুলনায় বেশি নিরাপদ এবং পড়তে সহজ কোড তৈরি করতে সাহায্য করে। Criteria API দিয়ে কোয়েরি লেখার সময় ডেটাবেস টেবিল এবং Java অবজেক্টের মধ্যে সম্পর্ক এবং শর্তাবলী নির্ধারণ করা সহজ হয়, যা ডেভেলপমেন্ট প্রক্রিয়াকে আরো কার্যকরী এবং দ্রুত করে তোলে।
Read more