Native Queries এর মাধ্যমে Complex Database Operations

Java Technologies - জেপিএ  (JPA) - Native SQL Queries
171

JPA (Java Persistence API) আপনাকে JPQL (Java Persistence Query Language) ব্যবহার করে Entity গুলির সাথে ইন্টারঅ্যাক্ট করার সুবিধা প্রদান করে। তবে, কিছু জটিল ডেটাবেস অপারেশন বা ডেটাবেস নির্দিষ্ট ফিচার (যেমন complex joins, subqueries, aggregate functions) ব্যবহার করার জন্য Native SQL Queries অত্যন্ত কার্যকরী হতে পারে। Native SQL Queries সরাসরি ডেটাবেসে SQL কুয়েরি পাঠানোর মাধ্যমে complex database operations সম্পাদন করতে সহায়তা করে।

Native Queries দিয়ে Complex Database Operations

JPA তে Native SQL Query ব্যবহার করার মাধ্যমে আপনি ডেটাবেসের কিছু জটিল অপারেশন খুব সহজেই করতে পারেন, যেমন:

  1. Complex Joins (JOIN Operations)
  2. Aggregate Functions (COUNT, SUM, AVG, etc.)
  3. Subqueries
  4. Group By and Having
  5. Pagination

এগুলো JPA তে Native SQL Query ব্যবহার করে কীভাবে করা যায়, তা নিচে বিস্তারিতভাবে দেখানো হবে।


1. Complex Joins

Joins সাধারণত বিভিন্ন টেবিলের মধ্যে সম্পর্ক স্থাপন করতে ব্যবহৃত হয়। জটিল INNER JOIN, LEFT JOIN বা RIGHT JOIN ব্যবহারের মাধ্যমে আপনি একাধিক টেবিল থেকে ডেটা সংগ্রহ করতে পারেন।

উদাহরণ: Complex Join using Native Query

ধরা যাক, আমাদের দুটি টেবিল Employee এবং Department রয়েছে এবং আমরা Employee এবং Department টেবিলের মধ্যে INNER JOIN করতে চাই।

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

public class EmployeeService {

    private EntityManager entityManager;

    public EmployeeService(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public List<Object[]> findEmployeeDepartmentDetails() {
        // Native SQL Query with JOIN operation
        String sql = "SELECT e.name, e.salary, d.name FROM Employee e " +
                     "INNER JOIN Department d ON e.department_id = d.id";
        
        Query query = entityManager.createNativeQuery(sql);
        
        return query.getResultList();  // Execute the query and return the result
    }
}

এখানে:

  • INNER JOIN ব্যবহার করে Employee এবং Department টেবিলের মধ্যে সম্পর্ক স্থাপন করা হয়েছে।
  • Object[] রিটার্ন টাইপ ব্যবহার করে একটি এক্সটার্নাল কাস্টম রেজাল্ট ফরম্যাটে ডেটা ফেরত পাওয়া যাবে (এখানে Employee এবং Department এর নাম ও বেতন ফিরে আসবে)।

2. Aggregate Functions (COUNT, SUM, AVG, MAX, MIN)

Aggregate Functions ডেটার উপর সমষ্টিগত অপারেশন সম্পাদন করতে ব্যবহৃত হয়, যেমন রেকর্ডের সংখ্যা, সর্বোচ্চ/সর্বনিম্ন মান, গড় মান, ইত্যাদি।

উদাহরণ: Aggregate Function using Native Query

ধরা যাক, আমরা Employee টেবিলের মধ্যে গড় বেতন বের করতে চাই।

import javax.persistence.EntityManager;
import javax.persistence.Query;

public class EmployeeService {

    private EntityManager entityManager;

    public EmployeeService(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public double getAverageSalary() {
        // Native SQL Query to calculate average salary
        String sql = "SELECT AVG(salary) FROM Employee";
        
        Query query = entityManager.createNativeQuery(sql);
        
        return (Double) query.getSingleResult();  // Return the average salary
    }
}

এখানে:

  • AVG(salary) aggregate function ব্যবহার করে Employee টেবিলের গড় বেতন বের করা হয়েছে।

3. Subqueries

Subqueries একাধিক কুয়েরির মধ্যে একটি কুয়েরি হতে পারে, যা আরেকটি কুয়েরির ফলাফল ব্যবহার করে। Subqueries জটিল ডেটাবেস অপারেশন করার জন্য ব্যবহার করা হয়, যেখানে একটি কুয়েরির রেজাল্ট অন্য কুয়েরির শর্ত হিসেবে ব্যবহৃত হয়।

উদাহরণ: Using Subquery in Native Query

ধরা যাক, আমরা সেই Employee গুলি খুঁজতে চাই যাদের বেতন গড় বেতনের চেয়ে বেশি।

import javax.persistence.EntityManager;
import javax.persistence.Query;

public class EmployeeService {

    private EntityManager entityManager;

    public EmployeeService(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public List<Employee> findEmployeesWithSalaryGreaterThanAverage() {
        // Native SQL Query with Subquery
        String sql = "SELECT * FROM Employee e WHERE e.salary > " +
                     "(SELECT AVG(salary) FROM Employee)";
        
        Query query = entityManager.createNativeQuery(sql, Employee.class);
        
        return query.getResultList();  // Execute the query and return the result
    }
}

এখানে:

  • Subquery ব্যবহার করা হয়েছে যা গড় বেতন বের করবে এবং তার পরে মূল কুয়েরি সেই বেতনের চেয়ে বেশি বেতন থাকা Employee গুলি ফেরত দেবে।

4. Group By and Having

GROUP BY এবং HAVING SQL ফিচার দুটি সাধারণত ডেটাকে গ্রুপ করা এবং একটি শর্তের ভিত্তিতে ডেটা ফিল্টার করার জন্য ব্যবহৃত হয়।

উদাহরণ: Using GROUP BY and HAVING in Native Query

ধরা যাক, আমরা Department অনুযায়ী Employee এর গড় বেতন বের করতে চাই, এবং শুধুমাত্র যেখানে গড় বেতন ৫০,০০০ এর বেশি।

import javax.persistence.EntityManager;
import javax.persistence.Query;

public class EmployeeService {

    private EntityManager entityManager;

    public EmployeeService(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    public List<Object[]> getAverageSalaryByDepartment() {
        // Native SQL Query with GROUP BY and HAVING
        String sql = "SELECT d.name, AVG(e.salary) FROM Employee e " +
                     "INNER JOIN Department d ON e.department_id = d.id " +
                     "GROUP BY d.name HAVING AVG(e.salary) > 50000";
        
        Query query = entityManager.createNativeQuery(sql);
        
        return query.getResultList();  // Execute the query and return the result
    }
}

এখানে:

  • GROUP BY ব্যবহৃত হয়েছে Department অনুযায়ী গ্রুপিং করার জন্য।
Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...