JPA তে Native Queries চালানোর প্রক্রিয়া

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

295

JPA (Java Persistence API) তে Native Queries চালানোর প্রক্রিয়া একটি শক্তিশালী উপায় যা আপনাকে ডেটাবেস নির্দিষ্ট SQL কুয়েরি চালানোর সুযোগ দেয়, বিশেষ করে যখন JPQL (Java Persistence Query Language) সীমাবদ্ধ হয়ে যায় অথবা আপনি ডেটাবেসের নিজস্ব ফিচার ব্যবহার করতে চান। Native SQL কুয়েরি EntityManager ব্যবহার করে চালানো হয় এবং এটি ডেটাবেসের আসল SQL সিনট্যাক্স ব্যবহার করে।

Native Queries চালানোর জন্য EntityManager ব্যবহার করা

JPA তে Native SQL Query চালানোর জন্য EntityManager এর createNativeQuery() মেথড ব্যবহার করা হয়। EntityManager কুয়েরি চালানোর জন্য একটি API প্রদান করে যা Native SQL কুয়েরি লেখার এবং ফলাফল পাওয়ার জন্য ব্যবহৃত হয়।

Native Query চালানোর ধাপসমূহ:

  1. Native SQL Query লেখার জন্য createNativeQuery() মেথড ব্যবহার করুন
  2. Query object তৈরি করুন এবং সেই Query তে parameter পাস করুন (যদি প্রয়োজন হয়)।
  3. Query execute করুন এবং ফলাফল সংগ্রহ করুন।

Native SQL Query চালানোর প্রক্রিয়া:

1. Native SQL Query with Entity Mapping

এই প্রক্রিয়ায়, আমরা Native SQL Query চালানোর জন্য Entity Class ব্যবহার করব, যাতে SQL Query এর ফলাফল সরাসরি Entity তে ম্যাপ করা যায়।

উদাহরণ:

ধরা যাক, আপনার কাছে Employee Entity ক্লাস রয়েছে এবং আপনি salary এর উপর ভিত্তি করে কর্মচারীদের তালিকা দেখতে চান। আপনার Native SQL Query হবে:

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<Employee> findEmployeesWithSalaryGreaterThan(double salary) {
        // Native SQL Query to fetch employees with salary greater than a specified value
        String sql = "SELECT * FROM Employee WHERE salary > :salary";

        Query query = entityManager.createNativeQuery(sql, Employee.class);
        query.setParameter("salary", salary);

        return query.getResultList();
    }
}

এখানে:

  • createNativeQuery() মেথডের মাধ্যমে Native SQL Query তৈরি করা হয়েছে।
  • Employee.class নির্দেশ করছে যে, SQL Query এর ফলাফল Employee Entity তে ম্যাপ হবে।
  • setParameter("salary", salary) প্যারামিটারটি সেট করে কাজ করা হয়েছে।

2. Native SQL Query without Entity Mapping

যখন আপনি Native SQL Query চালাতে চান কিন্তু Entity ক্লাসে সেই ডেটা ম্যাপ করতে চান না, তখন createNativeQuery() মেথডটি সরাসরি Object[] অথবা Object ব্যবহার করে ফলাফল ফেরত দিতে পারে।

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[]> findEmployeeNamesAndSalaries() {
        // Native SQL Query to fetch employee names and salaries
        String sql = "SELECT name, salary FROM Employee";

        Query query = entityManager.createNativeQuery(sql);
        
        return query.getResultList();
    }
}

এখানে:

  • Object[] আউটপুট টাইপে name এবং salary কলামসমূহের মান ফেরত আসবে।
  • ফলস্বরূপ, query.getResultList() কল করলে এটি একটি List<Object[]> ফেরত দেবে যেখানে প্রতিটি উপাদান একটি Array হবে।

3. Native SQL Query with Aggregation Functions

Native SQL Query তে aggregation functions (যেমন COUNT, SUM, AVG, MAX, MIN) ব্যবহার করা যায়। এখানে, আমরা Employee টেবিল থেকে salary এর উপর ভিত্তি করে গড় (average) গণনা করব।

public double getAverageSalary() {
    String sql = "SELECT AVG(salary) FROM Employee";

    Query query = entityManager.createNativeQuery(sql);

    return (Double) query.getSingleResult();
}

এখানে:

  • AVG(salary) দ্বারা কর্মচারীদের salary এর গড় বের করা হচ্ছে।
  • getSingleResult() মেথড ব্যবহার করে একটি একক মান (গড় salary) ফেরত পেয়েছি।

4. Native SQL Query with Named Parameters

যখন আপনার Native SQL Query তে প্যারামিটার থাকে, তখন named parameters ব্যবহার করা যেতে পারে:

public List<Employee> findEmployeesByDepartment(String department) {
    String sql = "SELECT * FROM Employee WHERE department = :department";

    Query query = entityManager.createNativeQuery(sql, Employee.class);
    query.setParameter("department", department);

    return query.getResultList();
}

এখানে:

  • :department প্যারামিটারটি SQL Query তে named parameter হিসেবে ব্যবহৃত হচ্ছে।
  • setParameter() মেথড ব্যবহার করে আমরা প্যারামিটারটি পাস করেছি।

5. Native SQL Query with Pagination

Native SQL Query তে পেজিনেশন (Paginated Results) ব্যবহার করার জন্য setFirstResult() এবং setMaxResults() ব্যবহার করা হয়।

public List<Employee> getPaginatedEmployees(int pageNumber, int pageSize) {
    String sql = "SELECT * FROM Employee";

    Query query = entityManager.createNativeQuery(sql, Employee.class);
    query.setFirstResult((pageNumber - 1) * pageSize);
    query.setMaxResults(pageSize);

    return query.getResultList();
}

এখানে:

  • setFirstResult(): এটি প্রথম ফলাফলটি নির্ধারণ করে।
  • setMaxResults(): এটি প্রতি পৃষ্ঠায় প্রদর্শিত সর্বোচ্চ ফলাফল সংখ্যা নির্ধারণ করে।

Native SQL Queries এর সুবিধা:

  1. ডেটাবেস নির্দিষ্ট কুয়েরি সাপোর্ট: যখন ডেটাবেস নির্দিষ্ট কুয়েরি বা অপ্টিমাইজড কুয়েরি চালাতে হয়, Native SQL খুবই কার্যকর।
  2. পারফরম্যান্স অপ্টিমাইজেশন: JPQL এর চেয়ে Native SQL কুয়েরি ডেটাবেসের নিজস্ব ক্ষমতা ব্যবহার করতে সাহায্য করতে পারে, যেমন indexing, optimizing joins, ইত্যাদি।
  3. ফিচার অ্যাক্সেস: কিছু ফিচার যেমন Window Functions, Full Text Search ইত্যাদি JPQL তে নেই, কিন্তু Native SQL তে ব্যবহার করা সম্ভব।

Native SQL Queries এর সীমাবদ্ধতা:

  1. ডেটাবেস নির্ভরশীলতা: Native SQL কুয়েরি ডেটাবেস নির্দিষ্ট হয়, অর্থাৎ এটি এক ডেটাবেসে কাজ করতে পারে, কিন্তু অন্য ডেটাবেসে কাজ নাও করতে পারে।
  2. JPQL সুবিধার অভাব: Native SQL কুয়েরি JPA এর শক্তিশালী Entity Relationships এবং automatic mapping সুবিধাগুলি সরবরাহ করে না।
  3. ডিবাগিং এবং রক্ষণাবেক্ষণ: Native SQL কুয়েরি কোডের রক্ষণাবেক্ষণ এবং ডিবাগিং সহজ নয়, বিশেষত যখন ডেটাবেসের মধ্যে পরিবর্তন আনা হয়।

সারাংশ


Native SQL Queries JPA তে ডেটাবেস নির্দিষ্ট কুয়েরি চালানোর একটি কার্যকরী উপায়। এটি EntityManager ব্যবহার করে createNativeQuery() মেথডের মাধ্যমে তৈরি করা হয় এবং এটি ডেটাবেসের আসল SQL সিনট্যাক্স ব্যবহার করে। Native SQL Queries JPQL এর তুলনায় অধিক কার্যকরী হতে পারে যখন complex joins, aggregation functions, window functions, বা database-specific features দরকার হয়। তবে, এর কিছু সীমাবদ্ধতা রয়েছে, যেমন এটি ডেটাবেস নির্ভরশীল, এবং জেপিএ এর automatic object mapping সুবিধাগুলি সরবরাহ করে না।

Content added By
Promotion

Are you sure to start over?

Loading...