JPA Query Language (JPQL) হল একটি Object-Relational Mapping (ORM) এর জন্য তৈরি করা query language, যা Java Persistence API (JPA) এর অংশ। JPQL ব্যবহার করে আমরা Java objects এবং relational database tables এর মধ্যে সম্পর্ক অনুসন্ধান করতে পারি। JPQL SQL-এর মতো দেখতে হলেও এটি database tables এর পরিবর্তে Java objects এবং তাদের properties এর উপর ভিত্তি করে কাজ করে।
Hibernate-এ JPQL ব্যবহার করা যেতে পারে, কারণ Hibernate হল JPA implementation। Hibernate ডেটাবেসে JPQL queries সম্পাদন করতে সক্ষম, যা ডেটাবেসের সাথে সম্পর্কিত Java entities এর উপর কার্যকরী হয়।
1. JPQL Overview
JPQL হল SQL-এর Object-Oriented version, যা JPA তে entity objects এর উপর কাজ করে, এবং তা ডেটাবেস টেবিলগুলির পরিবর্তে Java objects ব্যবহার করে। JPQL-এ SELECT, UPDATE, DELETE, INSERT এর মতো SQL কোয়েরি কার্যকরী করা যেতে পারে।
JPQL-এর বৈশিষ্ট্য:
- Entity Objects ব্যবহার করে ডেটাবেস টেবিলের পরিবর্তে।
- Named queries এবং dynamic queries এর মাধ্যমে JPQL কার্যকরী করা যায়।
- JPQL এ Join এবং Relationship গুলি খুব সহজেই পরিচালনা করা যায়।
- No direct reference to tables or columns: JPQL SQL এর মতো টেবিল এবং কলামের পরিবর্তে entities এবং তাদের attributes ব্যবহার করে।
2. JPQL Syntax and Example
Basic JPQL Query Example:
import javax.persistence.*;
import java.util.List;
public class JPQLExample {
public static void main(String[] args) {
// Create EntityManagerFactory and EntityManager
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("exampleUnit");
EntityManager entityManager = entityManagerFactory.createEntityManager();
try {
// Start a transaction
entityManager.getTransaction().begin();
// JPQL query to select all employees
Query query = entityManager.createQuery("SELECT e FROM Employee e");
List<Employee> employees = query.getResultList();
for (Employee employee : employees) {
System.out.println(employee.getName());
}
// Commit transaction
entityManager.getTransaction().commit();
} finally {
entityManager.close();
entityManagerFactory.close();
}
}
}
Explanation:
SELECT e FROM Employee e: এই JPQL query-টিEmployeeEntity class থেকে সমস্ত employee তথ্য ফিরিয়ে আনবে।eহল alias যা Employee entity কে নির্দেশ করছে।createQuery()method ব্যবহার করা হয়েছে JPQL query তৈরি করার জন্য, যাEntityManagerএর মাধ্যমে ডেটাবেসে execute করা হবে।
3. JPQL Query Clauses
JPQL-এ WHERE, JOIN, ORDER BY, GROUP BY ইত্যাদি clauses ব্যবহার করা যায়, যা SQL এর মতো কাজ করে কিন্তু Java objects-এর উপর ভিত্তি করে।
Example 1: WHERE Clause:
Query query = entityManager.createQuery("SELECT e FROM Employee e WHERE e.department = :department");
query.setParameter("department", "IT");
List<Employee> employees = query.getResultList();
WHEREক্লজ ব্যবহার করা হয়েছে যেখান থেকেITবিভাগের কর্মীদের তথ্য পাওয়া যাবে।
Example 2: JOIN Clause:
Query query = entityManager.createQuery("SELECT e FROM Employee e JOIN e.department d WHERE d.name = :departmentName");
query.setParameter("departmentName", "HR");
List<Employee> employees = query.getResultList();
JOINব্যবহার করা হয়েছে Employee এবং Department entity এর মধ্যে সম্পর্ক স্থাপন করার জন্য। এখানেe.departmentহল Many-to-One সম্পর্ক এবং d.name দ্বারা ডিপার্টমেন্টের নাম ফিল্টার করা হয়েছে।
Example 3: ORDER BY Clause:
Query query = entityManager.createQuery("SELECT e FROM Employee e ORDER BY e.salary DESC");
List<Employee> employees = query.getResultList();
ORDER BYক্লজ ব্যবহার করে employee.salary অনুসারে ডেটা সাজানো হয়েছে।
Example 4: GROUP BY Clause:
Query query = entityManager.createQuery("SELECT d.name, COUNT(e) FROM Employee e JOIN e.department d GROUP BY d.name");
List<Object[]> result = query.getResultList();
GROUP BYব্যবহার করে department name অনুযায়ী কর্মচারীদের গণনা করা হয়েছে।
4. JPQL Advanced Features
Named Queries:
- Named Queries হ'ল predefined JPQL queries, যা Entity class-এ @Query অ্যানোটেশন দ্বারা সংজ্ঞায়িত করা হয়। এগুলি পুনরায় ব্যবহারযোগ্য এবং কোডে একাধিকবার ব্যবহৃত হতে পারে।
Named Query Example:
@Entity
@NamedQuery(name = "Employee.findByDepartment", query = "SELECT e FROM Employee e WHERE e.department = :department")
public class Employee {
// Fields, constructors, getters, and setters
}
Using Named Query:
Query query = entityManager.createNamedQuery("Employee.findByDepartment");
query.setParameter("department", "IT");
List<Employee> employees = query.getResultList();
@NamedQueryব্যবহার করে আপনি একটি JPQL query একটি নামের সাথে সংজ্ঞায়িত করতে পারেন এবং পরে সেটি পুনরায় ব্যবহার করতে পারেন।
Pagination:
JPQL-এ pagination করতে আপনি setFirstResult() এবং setMaxResults() মেথড ব্যবহার করতে পারেন।
Pagination Example:
Query query = entityManager.createQuery("SELECT e FROM Employee e");
query.setFirstResult(0); // Start from the first result
query.setMaxResults(10); // Fetch 10 results only
List<Employee> employees = query.getResultList();
Dynamic Queries:
JPQL-এ ডাইনামিক কোয়েরি তৈরি করতে Criteria API বা QueryBuilder ব্যবহার করা হয়।
5. Hibernate এর সাথে JPQL
Hibernate JPA implementation হওয়ায়, Hibernate-এ JPQL ব্যবহার করা সম্ভব। Hibernate Session এর মাধ্যমে Criteria API অথবা JPQL ব্যবহার করে query execute করা যায়।
Example: Using JPQL in Hibernate:
Session session = sessionFactory.openSession();
session.beginTransaction();
// Using JPQL query
Query query = session.createQuery("SELECT e FROM Employee e WHERE e.salary > :minSalary");
query.setParameter("minSalary", 50000);
List<Employee> employees = query.getResultList();
for (Employee employee : employees) {
System.out.println(employee.getName() + ": " + employee.getSalary());
}
session.getTransaction().commit();
session.close();
Explanation:
- Hibernate Session এর মাধ্যমে
createQuery()মেথড ব্যবহার করে JPQL query তৈরি করা হয়েছে। query.setParameter()মেথড দ্বারা প্যারামিটার সেট করা হয়েছে।getResultList()মেথডটি query-এর ফলাফল রিটার্ন করে।
6. JPQL vs SQL
| Feature | JPQL | SQL |
|---|---|---|
| Syntax | Object-oriented, uses entities and attributes | Table-oriented, uses tables and columns |
| Query Focus | Operates on Java objects (entities) | Operates on database tables |
| Joins | Uses Java object relationships (e.g., @ManyToOne) | Uses SQL joins with tables |
| Use Case | Preferred for ORM-based applications with entities | Preferred for direct interaction with the database |
| Performance | Slight overhead due to abstraction | More efficient for direct database access |
- JPQL (Java Persistence Query Language) হল SQL-এর object-oriented সংস্করণ যা Hibernate এবং JPA এর মাধ্যমে Java entities-এর উপর কাজ করে। এটি Java objects এবং database tables এর মধ্যে সম্পর্ক নির্ধারণ করতে ব্যবহার করা হয়।
- Hibernate-এ JPQL ব্যবহার করে আপনি dynamic queries, pagination, named queries, fetch joins, এবং grouping ইত্যাদি কাজ সহজেই করতে পারেন।
- Named queries এবং Criteria API দ্বারা ডাইনামিক এবং পুনরায় ব্যবহারযোগ্য queries তৈরি করা যায়।
- JPQL Hibernate-এ performance optimization এবং query customization এর জন্য খুবই কার্যকরী, তবে SQL কমান্ডের মাধ্যমে direct database operations আরো দ্রুত হতে পারে।
Read more