Practical উদাহরণ: Complex Query তৈরি করা

Criteria API - জেপিএ  (JPA) - Java Technologies

295

JPA (Java Persistence API) ব্যবহার করে ডেটাবেসের সাথে কাজ করার সময় জটিল কুয়েরি তৈরি করতে JPQL (Java Persistence Query Language) বা Criteria API ব্যবহার করা যায়। JPQL, SQL এর মতো হলেও এটি অবজেক্ট ভিত্তিক এবং Entity অবজেক্টের সাথে কাজ করে। JPA এর মাধ্যমে complex queries তৈরি করা যায় যা ডেটাবেস টেবিলের মধ্যে জটিল সম্পর্ক বা শর্তের উপর ভিত্তি করে ডেটা রিট্রিভ করতে সহায়তা করে।

এই টিউটোরিয়ালে আমরা JPQL এবং Criteria API ব্যবহার করে complex queries তৈরি করার উদাহরণ দেখব।


১. JPQL (Java Persistence Query Language) ব্যবহার করে Complex Query

JPQL একটি স্ট্রিং ভিত্তিক কুয়েরি ভাষা যা Entity ক্লাসে ডেটা রিট্রিভ করার জন্য ব্যবহৃত হয়। JPQL-এর মাধ্যমে আপনি SQL-এর মতো কুয়েরি করতে পারবেন, কিন্তু এটি টেবিলের পরিবর্তে Entity ক্লাসের ওপর কাজ করে।

1.1 JPQL Query Example

ধরা যাক, আমাদের একটি Employee Entity রয়েছে যা name, age, salary, এবং department ফিল্ডগুলো ধারণ করে। এখন আমরা একটি জটিল কুয়েরি তৈরি করব যা:

  • নির্দিষ্ট বয়সের বেশি কর্মচারীদের তথ্য রিটার্ন করবে।
  • শুধুমাত্র নির্দিষ্ট department থেকে কর্মচারীদের তথ্য রিটার্ন করবে।

Entity Class: Employee

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Employee {
    
    @Id
    private Long id;
    private String name;
    private int age;
    private double salary;
    private String department;

    // Getters and Setters
}

JPQL Query Example:

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import java.util.List;

public class JpaComplexQueryExample {
    public static void main(String[] args) {
        // Create EntityManagerFactory and EntityManager
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJPAUnit");
        EntityManager em = emf.createEntityManager();
        
        // Create a JPQL query to retrieve employees with age > 30 and from "IT" department
        String jpql = "SELECT e FROM Employee e WHERE e.age > :age AND e.department = :dept";
        Query query = em.createQuery(jpql);
        
        // Set the parameters for the query
        query.setParameter("age", 30);
        query.setParameter("dept", "IT");
        
        // Execute the query and get the result
        List<Employee> employees = query.getResultList();
        
        // Print the results
        for (Employee employee : employees) {
            System.out.println("Employee: " + employee.getName() + ", Age: " + employee.getAge() + ", Department: " + employee.getDepartment());
        }

        // Close EntityManager and EntityManagerFactory
        em.close();
        emf.close();
    }
}

Explanation:

  • JPQL Query: SELECT e FROM Employee e WHERE e.age > :age AND e.department = :dept - এটি একটি সিম্পল SELECT কুয়েরি যা age এবং department এর ভিত্তিতে কর্মচারীদের তথ্য রিটার্ন করবে।
  • query.setParameter(): এটি কুয়েরির প্যারামিটার নির্ধারণ করে। এখানে age এবং dept প্যারামিটার ব্যবহার করা হয়েছে।

২. Criteria API ব্যবহার করে Complex Query

Criteria API JPA-এর একটি শক্তিশালী ফিচার যা টাইপ সেফ কুয়েরি তৈরি করতে সহায়তা করে। এটি ডায়নামিক কুয়েরি তৈরি করার জন্য ব্যবহৃত হয় এবং Java কোডের মাধ্যমে কুয়েরি তৈরি করা সম্ভব হয়।

2.1 Criteria API Query Example

ধরা যাক, আমরা Criteria API ব্যবহার করে একই কুয়েরি তৈরি করতে চাই, যেখানে age এবং department এর ভিত্তিতে কর্মচারীদের তথ্য রিট্রিভ করা হবে।

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.List;

public class JpaCriteriaApiExample {
    public static void main(String[] args) {
        // Create EntityManagerFactory and EntityManager
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJPAUnit");
        EntityManager em = emf.createEntityManager();
        
        // Create CriteriaBuilder and CriteriaQuery
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Employee> cq = cb.createQuery(Employee.class);
        
        // Define the root of the query (Entity to be queried)
        Root<Employee> employeeRoot = cq.from(Employee.class);
        
        // Define the conditions (age > 30 AND department = "IT")
        Predicate agePredicate = cb.greaterThan(employeeRoot.get("age"), 30);
        Predicate departmentPredicate = cb.equal(employeeRoot.get("department"), "IT");
        
        // Combine the conditions using AND
        cq.select(employeeRoot).where(cb.and(agePredicate, departmentPredicate));
        
        // Execute the query and get the result
        List<Employee> employees = em.createQuery(cq).getResultList();
        
        // Print the results
        for (Employee employee : employees) {
            System.out.println("Employee: " + employee.getName() + ", Age: " + employee.getAge() + ", Department: " + employee.getDepartment());
        }

        // Close EntityManager and EntityManagerFactory
        em.close();
        emf.close();
    }
}

Explanation:

  • CriteriaBuilder: CriteriaBuilder JPA এর কুয়েরি তৈরি করার জন্য ব্যবহৃত হয়।
  • Root: Root<Employee> Entity থেকে ডেটা রিট্রিভ করার জন্য একটি রুট অবজেক্ট তৈরি করা হয়।
  • Predicate: Predicate ক্লাসটি শর্ত তৈরি করার জন্য ব্যবহৃত হয়।
  • cb.greaterThan() এবং cb.equal(): এগুলো শর্ত তৈরি করার জন্য ব্যবহৃত হয়, যেখানে বয়স বড় (greaterThan) এবং বিভাগ সমান (equal) হতে হবে।
  • cb.and(): এই পদ্ধতিটি দুটি শর্ত একসাথে যুক্ত করে।

৩. প্যারামিটারাইজড JPQL কুয়েরি

JPQL কুয়েরি আরও প্যারামিটারাইজড হতে পারে, যেখানে ডাইনামিক প্যারামিটার ব্যবহার করা হয়। এটি খুবই কার্যকরী যখন ব্যবহারকারী ইনপুট বা কন্ডিশনের উপর ভিত্তি করে কুয়েরি তৈরি করতে হয়।

JPQL Example with Dynamic Parameters

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import java.util.List;

public class DynamicJPQLExample {
    public static void main(String[] args) {
        // Create EntityManagerFactory and EntityManager
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJPAUnit");
        EntityManager em = emf.createEntityManager();
        
        // Create a dynamic JPQL query
        String jpql = "SELECT e FROM Employee e WHERE e.salary > :minSalary AND e.age < :maxAge";
        Query query = em.createQuery(jpql);
        
        // Set dynamic parameters
        query.setParameter("minSalary", 50000);
        query.setParameter("maxAge", 50);
        
        // Execute the query and get the result
        List<Employee> employees = query.getResultList();
        
        // Print the results
        for (Employee employee : employees) {
            System.out.println("Employee: " + employee.getName() + ", Salary: " + employee.getSalary() + ", Age: " + employee.getAge());
        }

        // Close EntityManager and EntityManagerFactory
        em.close();
        emf.close();
    }
}

Explanation:

  • setParameter(): এই পদ্ধতিটি ডাইনামিক প্যারামিটার ব্যবহার করার জন্য ব্যবহৃত হয়। এখানে minSalary এবং maxAge প্যারামিটার ব্যবহার করা হয়েছে।

সারাংশ


JPA ব্যবহার করে complex queries তৈরি করতে JPQL (Java Persistence Query Language) এবং Criteria API দুটি শক্তিশালী অপশন। JPQL SQL-এর মতো কুয়েরি লেখার সুবিধা দেয়, যেখানে Criteria API টাইপ সেফ এবং ডাইনামিক কুয়েরি তৈরি করার জন্য ব্যবহার করা হয়।

  • JPQL-এ parameterized queries এবং dynamic conditions সহজে তৈরি করা যায়।
  • Criteria API জটিল কুয়েরি তৈরি করতে আরও বেশি নমনীয় এবং টাইপ সেফ পদ্ধতি প্রদান করে।

এই পদ্ধতিগুলি JPA-এর শক্তি বাড়ায় এবং ডেটাবেস থেকে ডেটা রিট্রিভ করতে ডেভেলপারদের আরও সহজ এবং কার্যকরী উপায় প্রদান করে।

Content added By
Promotion

Are you sure to start over?

Loading...