Native Query এবং Named Query

Java Technologies - স্প্রিং বুট ওআরএম (Spring Boot ORM)
115
115

Native Query

Native Query হলো সরাসরি ডেটাবেস-স্পেসিফিক SQL কোয়েরি যা Hibernate বা JPA ব্যবহার করে ডেটাবেস অপারেশন সম্পন্ন করতে ব্যবহৃত হয়। এটি এমন ক্ষেত্রে ব্যবহার করা হয় যেখানে জটিল কুয়েরি বা ডেটাবেস-স্পেসিফিক ফিচার প্রয়োজন হয়।


Native Query উদাহরণ

Native Query ব্যবহার করে সরল উদাহরণ

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface ProductRepository extends JpaRepository<Product, Long> {
    @Query(value = "SELECT * FROM products WHERE price > :price", nativeQuery = true)
    List<Product> findProductsAbovePrice(@Param("price") Double price);
}

ব্যবহার:

List<Product> products = productRepository.findProductsAbovePrice(50000.0);
products.forEach(product -> System.out.println(product.getName()));

Native Query এর সুবিধা

  • ডেটাবেস-স্পেসিফিক অপ্টিমাইজেশন ব্যবহার করা যায়।
  • জটিল জয়েন বা সাব-কুয়েরি পরিচালনা করা সহজ।

Native Query এর সীমাবদ্ধতা

  • কোড ডেটাবেস-স্পেসিফিক হয়ে যায় (পোর্টেবিলিটি হ্রাস পায়)।
  • কোয়েরি পরিচালনার সময় ORM এর সুবিধা কম পাওয়া যায়।

Named Query

Named Query হলো প্রি-ডিফাইন্ড কুয়েরি যা Entity ক্লাস বা orm.xml ফাইলে সংজ্ঞায়িত করা হয়। এটি রিইউজেবল কুয়েরি তৈরি করার জন্য কার্যকর এবং কোডে রিডেবিলিটি বাড়ায়।


Named Query উদাহরণ

Entity ক্লাসে Named Query সংজ্ঞায়িত করা

import jakarta.persistence.*;

@Entity
@NamedQueries({
    @NamedQuery(
        name = "Product.findByName",
        query = "SELECT p FROM Product p WHERE p.name = :name"
    ),
    @NamedQuery(
        name = "Product.findByPriceRange",
        query = "SELECT p FROM Product p WHERE p.price BETWEEN :minPrice AND :maxPrice"
    )
})
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private Double price;

    // Getters and Setters
}

Named Query ব্যবহার করা

Repository ক্লাসে ব্যবহার:

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface ProductRepository extends JpaRepository<Product, Long> {
    List<Product> findByName(@Param("name") String name);
    List<Product> findByPriceRange(@Param("minPrice") Double minPrice, @Param("maxPrice") Double maxPrice);
}

ব্যবহার:

List<Product> productsByName = productRepository.findByName("Laptop");
productsByName.forEach(product -> System.out.println(product.getName()));

List<Product> productsInRange = productRepository.findByPriceRange(30000.0, 70000.0);
productsInRange.forEach(product -> System.out.println(product.getName()));

Named Query এর সুবিধা

  • রিইউজেবল: একবার সংজ্ঞায়িত করলে কোডের বিভিন্ন স্থানে ব্যবহার করা যায়।
  • রিডেবিলিটি: কোড সহজে পড়া এবং বুঝা যায়।
  • স্ট্যাটিক চেকিং: অ্যাপ্লিকেশন চালানোর আগে কোয়েরি যাচাই করা যায়।

Named Query এর সীমাবদ্ধতা

  • কুয়েরি বড় হলে Entity ক্লাসের কোড জটিল হয়ে যেতে পারে।
  • অ্যাপ্লিকেশন কনফিগারেশন বা মেইনটেন্যান্স কঠিন হতে পারে।

তুলনা: Native Query এবং Named Query

বৈশিষ্ট্যNative QueryNamed Query
সংজ্ঞাসরাসরি SQL কোয়েরি।প্রি-ডিফাইন্ড কুয়েরি যা JPA বা Hibernate এ ব্যবহৃত হয়।
ডেটাবেস নির্ভরতাডেটাবেস স্পেসিফিক।ORM-নির্ভর (SQL নয়)।
কোড পোর্টেবিলিটিকম।বেশি।
রিডেবিলিটিকম।বেশি।
ব্যবহার পরিস্থিতিজটিল SQL বা ডেটাবেস ফিচার দরকার হলে।সাধারণ বা রিইউজেবল কুয়েরি দরকার হলে।

Content added By

Native Query কি এবং এর ব্যবহার

101
101

Native Query হলো ডেটাবেস-স্পেসিফিক SQL স্টেটমেন্ট যা স্প্রিং ডেটা জেপিএ (Spring Data JPA)-তে ব্যবহৃত হয়। এটি ব্যবহার করে সরাসরি SQL স্টেটমেন্ট চালিয়ে ডেটাবেস থেকে ডেটা রিট্রাইভ বা আপডেট করা যায়। যখন JPQL (Java Persistence Query Language) বা JPA-এর ডিফল্ট পদ্ধতিতে কাঙ্ক্ষিত ফলাফল পাওয়া যায় না, তখন Native Query ব্যবহৃত হয়।


Native Query কি?

Native Query হলো ডেটাবেসে সরাসরি SQL কমান্ড চালানোর একটি পদ্ধতি। এটি JPA-এর @Query এনোটেশনের মাধ্যমে লেখা হয় এবং SQL কমান্ড সরাসরি ডেটাবেসে কার্যকর হয়।

বৈশিষ্ট্য

  • ডেটাবেস স্পেসিফিক SQL ব্যবহার করা যায়।
  • জটিল কুয়েরি, যেমন জয়েন (JOIN), সাব-কুয়েরি (Subquery) বা ডেটাবেস-স্পেসিফিক ফাংশন ব্যবহারের জন্য উপযোগী।
  • ডিফল্ট JPA পদ্ধতির সীমাবদ্ধতা অতিক্রম করতে সাহায্য করে।

Native Query এর ব্যবহারের ধাপ

১. @Query এনোটেশন ব্যবহার

Native Query ডিফাইন করার জন্য @Query এনোটেশন ব্যবহার করতে হয় এবং nativeQuery = true প্যারামিটার সেট করতে হয়।

২. ডেটাবেস ফিল্ডের সাথে ম্যাপিং নিশ্চিত করা

Native Query থেকে প্রাপ্ত ফলাফল Entity ক্লাস বা কাস্টম অবজেক্টের সাথে সঠিকভাবে ম্যাপ করতে হবে।


উদাহরণ

Entity ক্লাস

import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@Entity
public class User {
    @Id
    private Long id;
    private String name;
    private String email;

    // Getter এবং Setter
    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 String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
}

Repository ইন্টারফেস

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface UserRepository extends JpaRepository<User, Long> {

    // Native Query উদাহরণ
    @Query(value = "SELECT * FROM user WHERE name = :name", nativeQuery = true)
    List<User> findUsersByName(@Param("name") String name);

    // Native Query এর মাধ্যমে নির্দিষ্ট ফিল্ড রিট্রাইভ করা
    @Query(value = "SELECT email FROM user WHERE id = :id", nativeQuery = true)
    String findEmailById(@Param("id") Long id);
}

Controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping("/by-name/{name}")
    public List<User> getUsersByName(@PathVariable String name) {
        return userRepository.findUsersByName(name);
    }

    @GetMapping("/email/{id}")
    public String getEmailById(@PathVariable Long id) {
        return userRepository.findEmailById(id);
    }
}

Native Query এর সুবিধা

  • ডেটাবেস স্পেসিফিক ফিচার সমর্থন করে: সাব-কুয়েরি, জটিল জয়েন এবং কাস্টম ফাংশনের ব্যবহার সহজ করে।
  • জটিল কুয়েরি পরিচালনা: যখন JPQL বা ডিফল্ট JPA পদ্ধতিতে সীমাবদ্ধতা থাকে, তখন Native Query ব্যবহার করা হয়।
  • উন্নত পারফরম্যান্স: নির্দিষ্ট কিছু ক্ষেত্রে এটি দ্রুততর হতে পারে কারণ এটি সরাসরি ডেটাবেস SQL ব্যবহার করে।

Native Query এর সীমাবদ্ধতা

  • ডেটাবেস ডিপেন্ডেন্ট: এটি নির্দিষ্ট ডেটাবেসের জন্য তৈরি, তাই ডেটাবেস পরিবর্তনের সময় কুয়েরি আপডেট করতে হয়।
  • কোডের জটিলতা বৃদ্ধি: SQL স্টেটমেন্ট সরাসরি কোডে লেখার ফলে কোড মেইনটেনেন্স কঠিন হতে পারে।
  • টাইপ সেফটি অনুপস্থিত: Native Query টাইপ সেফ নয়, ফলে রUNTIME ত্রুটি ঘটার সম্ভাবনা বেশি।

Native Query বনাম JPQL

বৈশিষ্ট্যNative QueryJPQL
লেখার ধরনডেটাবেস স্পেসিফিক SQLজাভা অবজেক্ট ভিত্তিক JPA ল্যাঙ্গুয়েজ
ডেটাবেস নির্ভরতাডেটাবেস নির্ভরডেটাবেস ইন্ডিপেন্ডেন্ট
ব্যবহারিক ক্ষেত্রজটিল SQL স্টেটমেন্ট এবং ডেটাবেস ফাংশনসাধারণ ডেটা ফিল্টারিং এবং রিলেশন ম্যানেজমেন্ট
পারফরম্যান্সনির্দিষ্ট ক্ষেত্রে দ্রুতসাধারণত ডেটাবেস নির্ভর নয়, তাই কিছুটা ধীর

সারমর্ম

Native Query স্প্রিং বুট ORM-এ এমন একটি গুরুত্বপূর্ণ টুল যা ডেটাবেসের জটিল কুয়েরি পরিচালনা করতে ব্যবহৃত হয়। এটি সরাসরি SQL স্টেটমেন্ট ব্যবহার করে কাজ করায় ডেটাবেস স্পেসিফিক ফিচার কাজে লাগানো যায়। তবে এটি ব্যবহারের সময় ডেটাবেস নির্ভরতা এবং কোড মেইনটেনেন্সের বিষয়গুলো বিবেচনায় রাখতে হবে।

Content added By

@Query এবং @NamedQuery অ্যানোটেশন এর মাধ্যমে Named Query তৈরি করা

135
135

@Query অ্যানোটেশন

Spring Data JPA-তে @Query অ্যানোটেশন ব্যবহার করে কাস্টম SQL বা JPQL (Java Persistence Query Language) কোয়েরি লেখা যায়। এটি ডাটাবেস অপারেশনকে আরও কাস্টমাইজ করার সুযোগ দেয় এবং ডিফল্ট মেথডের বাইরে বিশেষ কন্ডিশনে ডেটা রিট্রিভ বা ম্যানিপুলেট করার জন্য ব্যবহার হয়।

@Query এর ব্যবহার

@Query অ্যানোটেশন সরাসরি একটি Repository ইন্টারফেসের মেথডের ওপরে ব্যবহার করা হয়।

সাধারণ উদাহরণ:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
    @Query("SELECT e FROM Employee e WHERE e.department = :department")
    List<Employee> findByDepartment(@Param("department") String department);
}

বিবরণ:

  • @Query এর মধ্যে JPQL (Hibernate-সমর্থিত SQL) কোয়েরি ব্যবহার করা হয়েছে।
  • @Param ব্যবহার করে প্যারামিটার ম্যাপিং করা হয়েছে।

@NamedQuery অ্যানোটেশন

@NamedQuery হলো Hibernate এবং JPA-তে পূর্বনির্ধারিত কাস্টম কোয়েরি। এটি Entity ক্লাসে ডিফাইন করা হয় এবং Spring Data JPA এর মাধ্যমে ডাকা হয়। @NamedQuery-এর প্রধান সুবিধা হলো কোয়েরি একবার কম্পাইল হওয়ার পর একাধিকবার পুনর্ব্যবহারযোগ্য হওয়া।

@NamedQuery এর ব্যবহার

Entity ক্লাসে @NamedQuery ডিফাইন করা:

import jakarta.persistence.*;

@Entity
@NamedQuery(name = "Employee.findByDepartment", query = "SELECT e FROM Employee e WHERE e.department = :department")
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String department;

    // Getters and Setters
}

Repository ইন্টারফেসে @NamedQuery ব্যবহার:

import org.springframework.stereotype.Repository;

@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
    List<Employee> findByDepartment(@Param("department") String department);
}

@Query এবং @NamedQuery এর মধ্যে পার্থক্য

বৈশিষ্ট্য@Query@NamedQuery
ডিফাইন করার স্থানRepository ইন্টারফেসে ডিফাইন করা হয়।Entity ক্লাসে ডিফাইন করা হয়।
কোডের স্থানীয়তানির্দিষ্ট মেথডের জন্য সীমাবদ্ধ।পুনর্ব্যবহারযোগ্য, বিভিন্ন মেথডে ব্যবহার করা যায়।
কোড সংরক্ষণকোয়েরি প্রতি মেথডে আলাদা সংরক্ষণ।একবার সংরক্ষণ করে বারবার ব্যবহার।
সহজতানতুন মেথড যোগ করা সহজ।নতুন মেথড যোগ করার আগে Entity আপডেট করতে হয়।

উদাহরণ: @Query এবং @NamedQuery একত্রে ব্যবহার

@Query ব্যবহার:

@Query("SELECT e FROM Employee e WHERE e.salary > :salary")
List<Employee> findEmployeesWithSalaryGreaterThan(@Param("salary") Double salary);

@NamedQuery ব্যবহার:

@Entity
@NamedQuery(name = "Employee.findEmployeesWithSalaryGreaterThan", query = "SELECT e FROM Employee e WHERE e.salary > :salary")
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private Double salary;

    // Getters and Setters
}

Repository মেথড:

List<Employee> findEmployeesWithSalaryGreaterThan(@Param("salary") Double salary);

সারাংশ

  • @Query অ্যানোটেশন দ্রুত কাস্টম কোয়েরি লেখার জন্য Repository লেয়ারে ব্যবহার করা হয়।
  • @NamedQuery আগে থেকেই ডিফাইন করা কাস্টম কোয়েরি পুনর্ব্যবহার করার জন্য Entity ক্লাসে ব্যবহার করা হয়।
  • এই দুই অ্যানোটেশন ডেটাবেস অপারেশনকে আরও ফ্লেক্সিবল এবং কার্যকর করে তোলে।

Content added By

উদাহরণ সহ Native এবং Named Query

111
111

স্প্রিং বুট ORM (Spring Boot ORM) এর মাধ্যমে ডেটাবেজে প্রশ্ন (query) করার জন্য দুটি প্রধান ধরনের কৌশল রয়েছে: Native Query এবং Named Query। এই দুটি কৌশল স্প্রিং ডেটা JPA বা Hibernate এর সাহায্যে ডেটাবেজে নির্দিষ্ট অপারেশন করতে ব্যবহৃত হয়। আসুন, আমরা এই দুটি কৌশল এবং তাদের ব্যবহার উদাহরণসহ বুঝে দেখি।


Native Query

Native Query হলো ডেটাবেজের SQL স্টাইল ব্যবহার করে কোয়েরি করার পদ্ধতি। যখন JPA বা Hibernate এর মাধ্যমে সাধারণ JPQL (Java Persistence Query Language) দিয়ে ডেটাবেজে প্রশ্ন করা হয় না, তখন Native SQL ব্যবহার করা হয়।

Native Query SQL স্টাইলের কোয়েরি ব্যবহার করতে সক্ষম করে, যেমন যে SQL কোয়েরি ডেটাবেজের জন্য বিশেষভাবে তৈরি করা হয়েছে।

Native Query এর উদাহরণ:

ধরা যাক আমাদের একটি Employee Entity ক্লাস আছে, যেখানে id, name, এবং salary ফিল্ড রয়েছে। আমরা একটি native query ব্যবহার করে salary এর ওপর ভিত্তি করে Employee তালিকা আনতে চাই।

Employee Entity ক্লাস:

import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@Entity
public class Employee {

    @Id
    private Long id;
    private String name;
    private Double salary;

    // Getters and Setters
}

Native Query ব্যবহার করা:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;

public interface EmployeeRepository extends JpaRepository<Employee, Long> {

    @Query(value = "SELECT * FROM Employee e WHERE e.salary > :salary", nativeQuery = true)
    List<Employee> findEmployeesWithSalaryGreaterThan(@Param("salary") Double salary);
}

এখানে, @Query অ্যানোটেশন ব্যবহার করে আমরা SQL স্টাইলে কোয়েরি লিখেছি, যেখানে nativeQuery = true নির্দেশ করা হয়েছে।

ব্যবহার:

@Autowired
private EmployeeRepository employeeRepository;

public void getEmployees() {
    List<Employee> employees = employeeRepository.findEmployeesWithSalaryGreaterThan(50000.0);
    employees.forEach(employee -> System.out.println(employee.getName()));
}

এই কোডে, salary এর তুলনায় বড় এমন সমস্ত Employee অবজেক্ট ডেটাবেজ থেকে নিয়ে আসা হবে।


Named Query

Named Query হলো JPA-এর একটি বৈশিষ্ট্য, যা কোয়েরি লেখার জন্য নির্দিষ্ট নাম ব্যবহার করে এবং একটি কেন্দ্রীয় স্থান থেকে (যেমন Entity ক্লাসের মধ্যে) সেই কোয়েরি রেজিস্টার করে। Named Query ব্যবহার করার সময় কোয়েরি লিখে তা Entity ক্লাসের মধ্যে @Query অ্যানোটেশন বা @NamedQuery অ্যানোটেশন ব্যবহার করে সংজ্ঞায়িত করা হয়।

Named Query এর উদাহরণ:

ধরা যাক, আমাদের একটি Department Entity ক্লাস রয়েছে, যেখানে id, name এবং location ফিল্ড রয়েছে। আমরা Named Query ব্যবহার করে Department নামের ভিত্তিতে সমস্ত ডেটা পাওয়ার চেষ্টা করব।

Department Entity ক্লাস:

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.NamedQuery;

@Entity
@NamedQuery(name = "Department.findByName", query = "SELECT d FROM Department d WHERE d.name = :name")
public class Department {

    @Id
    private Long id;
    private String name;
    private String location;

    // Getters and Setters
}

এখানে, @NamedQuery অ্যানোটেশন ব্যবহার করে Department.findByName নামক একটি কোয়েরি সংজ্ঞায়িত করা হয়েছে। এই Named Query কেবলমাত্র Department নামের জন্য সমস্ত রেকর্ড আনতে ব্যবহৃত হবে।

Named Query ব্যবহার করা:

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;

public interface DepartmentRepository extends JpaRepository<Department, Long> {

    @Query(name = "Department.findByName")
    List<Department> findByName(@Param("name") String name);
}

এখানে, @Query(name = "Department.findByName") দিয়ে আমরা Department.findByName নামক Named Query ব্যবহার করেছি।

ব্যবহার:

@Autowired
private DepartmentRepository departmentRepository;

public void getDepartments() {
    List<Department> departments = departmentRepository.findByName("Sales");
    departments.forEach(department -> System.out.println(department.getLocation()));
}

এই কোডের মাধ্যমে আমরা Sales নামের সমস্ত Department অবজেক্ট ডেটাবেজ থেকে নিয়ে আসব।


Native এবং Named Query এর তুলনা

বৈশিষ্ট্যNative QueryNamed Query
কোয়েরি ধরনের স্টাইলSQL কোয়েরি (ডেটাবেজ নির্দিষ্ট)JPQL (Java Persistence Query Language)
কোড লেখার স্থানকোডে সরাসরি কোয়েরি লেখা হয়Entity ক্লাসে কোয়েরি সংজ্ঞায়িত করা হয়
পারফরম্যান্সসাধারণত দ্রুত, কিন্তু ডেটাবেজ নির্ভরডেটাবেজ নিরপেক্ষ, তবে কিছু পরিস্থিতিতে ধীর হতে পারে
ডেটাবেজ নির্ভরতাডেটাবেজ নির্দিষ্ট (RDBMS নির্ভর)ডেটাবেজ নিরপেক্ষ (JPA নির্ভর)
উপযোগিতাবিশেষ SQL ফিচার ব্যবহার করার সময়JPQL বা সাধারণ ডেটাবেজ অপারেশন করার সময়

সারসংক্ষেপ

  • Native Query ব্যবহার করে সরাসরি SQL কোয়েরি ব্যবহার করা হয়, যা ডেটাবেজ নির্দিষ্ট এবং কিছু বিশেষ পরিস্থিতিতে কার্যকর।
  • Named Query হলো JPA-এর একটি শক্তিশালী বৈশিষ্ট্য যা কোয়েরি রিফারেন্স এবং ডেটাবেজ নিরপেক্ষতা নিশ্চিত করে। এটি Entity ক্লাসে সংজ্ঞায়িত করা হয় এবং বিভিন্ন অংশে পুনঃব্যবহার করা যায়।
  • যখন আপনি ডেটাবেজ নির্দিষ্ট SQL কোয়েরি ব্যবহার করতে চান, তখন Native Query ব্যবহার করুন, এবং যখন ডেটাবেজ নিরপেক্ষ, সাধারণ কোয়েরি ব্যবহার করতে চান, তখন Named Query ব্যবহার করা উচিত।
Content added By
Promotion