Native Query হলো সরাসরি ডেটাবেস-স্পেসিফিক SQL কোয়েরি যা Hibernate বা JPA ব্যবহার করে ডেটাবেস অপারেশন সম্পন্ন করতে ব্যবহৃত হয়। এটি এমন ক্ষেত্রে ব্যবহার করা হয় যেখানে জটিল কুয়েরি বা ডেটাবেস-স্পেসিফিক ফিচার প্রয়োজন হয়।
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()));
Named Query হলো প্রি-ডিফাইন্ড কুয়েরি যা Entity ক্লাস বা orm.xml
ফাইলে সংজ্ঞায়িত করা হয়। এটি রিইউজেবল কুয়েরি তৈরি করার জন্য কার্যকর এবং কোডে রিডেবিলিটি বাড়ায়।
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
}
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()));
বৈশিষ্ট্য | Native Query | Named Query |
---|---|---|
সংজ্ঞা | সরাসরি SQL কোয়েরি। | প্রি-ডিফাইন্ড কুয়েরি যা JPA বা Hibernate এ ব্যবহৃত হয়। |
ডেটাবেস নির্ভরতা | ডেটাবেস স্পেসিফিক। | ORM-নির্ভর (SQL নয়)। |
কোড পোর্টেবিলিটি | কম। | বেশি। |
রিডেবিলিটি | কম। | বেশি। |
ব্যবহার পরিস্থিতি | জটিল SQL বা ডেটাবেস ফিচার দরকার হলে। | সাধারণ বা রিইউজেবল কুয়েরি দরকার হলে। |
Native Query হলো ডেটাবেস-স্পেসিফিক SQL স্টেটমেন্ট যা স্প্রিং ডেটা জেপিএ (Spring Data JPA)-তে ব্যবহৃত হয়। এটি ব্যবহার করে সরাসরি SQL স্টেটমেন্ট চালিয়ে ডেটাবেস থেকে ডেটা রিট্রাইভ বা আপডেট করা যায়। যখন JPQL (Java Persistence Query Language) বা JPA-এর ডিফল্ট পদ্ধতিতে কাঙ্ক্ষিত ফলাফল পাওয়া যায় না, তখন Native Query ব্যবহৃত হয়।
Native Query হলো ডেটাবেসে সরাসরি SQL কমান্ড চালানোর একটি পদ্ধতি। এটি JPA-এর @Query এনোটেশনের মাধ্যমে লেখা হয় এবং SQL কমান্ড সরাসরি ডেটাবেসে কার্যকর হয়।
Native Query ডিফাইন করার জন্য @Query এনোটেশন ব্যবহার করতে হয় এবং nativeQuery = true
প্যারামিটার সেট করতে হয়।
Native Query থেকে প্রাপ্ত ফলাফল 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;
}
}
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);
}
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 |
---|---|---|
লেখার ধরন | ডেটাবেস স্পেসিফিক SQL | জাভা অবজেক্ট ভিত্তিক JPA ল্যাঙ্গুয়েজ |
ডেটাবেস নির্ভরতা | ডেটাবেস নির্ভর | ডেটাবেস ইন্ডিপেন্ডেন্ট |
ব্যবহারিক ক্ষেত্র | জটিল SQL স্টেটমেন্ট এবং ডেটাবেস ফাংশন | সাধারণ ডেটা ফিল্টারিং এবং রিলেশন ম্যানেজমেন্ট |
পারফরম্যান্স | নির্দিষ্ট ক্ষেত্রে দ্রুত | সাধারণত ডেটাবেস নির্ভর নয়, তাই কিছুটা ধীর |
Native Query স্প্রিং বুট ORM-এ এমন একটি গুরুত্বপূর্ণ টুল যা ডেটাবেসের জটিল কুয়েরি পরিচালনা করতে ব্যবহৃত হয়। এটি সরাসরি SQL স্টেটমেন্ট ব্যবহার করে কাজ করায় ডেটাবেস স্পেসিফিক ফিচার কাজে লাগানো যায়। তবে এটি ব্যবহারের সময় ডেটাবেস নির্ভরতা এবং কোড মেইনটেনেন্সের বিষয়গুলো বিবেচনায় রাখতে হবে।
Spring Data JPA-তে @Query অ্যানোটেশন ব্যবহার করে কাস্টম SQL বা JPQL (Java Persistence Query Language) কোয়েরি লেখা যায়। এটি ডাটাবেস অপারেশনকে আরও কাস্টমাইজ করার সুযোগ দেয় এবং ডিফল্ট মেথডের বাইরে বিশেষ কন্ডিশনে ডেটা রিট্রিভ বা ম্যানিপুলেট করার জন্য ব্যবহার হয়।
@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 হলো Hibernate এবং JPA-তে পূর্বনির্ধারিত কাস্টম কোয়েরি। এটি Entity ক্লাসে ডিফাইন করা হয় এবং Spring Data JPA এর মাধ্যমে ডাকা হয়। @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 |
---|---|---|
ডিফাইন করার স্থান | Repository ইন্টারফেসে ডিফাইন করা হয়। | Entity ক্লাসে ডিফাইন করা হয়। |
কোডের স্থানীয়তা | নির্দিষ্ট মেথডের জন্য সীমাবদ্ধ। | পুনর্ব্যবহারযোগ্য, বিভিন্ন মেথডে ব্যবহার করা যায়। |
কোড সংরক্ষণ | কোয়েরি প্রতি মেথডে আলাদা সংরক্ষণ। | একবার সংরক্ষণ করে বারবার ব্যবহার। |
সহজতা | নতুন মেথড যোগ করা সহজ। | নতুন মেথড যোগ করার আগে Entity আপডেট করতে হয়। |
@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);
স্প্রিং বুট ORM (Spring Boot ORM) এর মাধ্যমে ডেটাবেজে প্রশ্ন (query) করার জন্য দুটি প্রধান ধরনের কৌশল রয়েছে: Native Query এবং Named Query। এই দুটি কৌশল স্প্রিং ডেটা JPA বা Hibernate এর সাহায্যে ডেটাবেজে নির্দিষ্ট অপারেশন করতে ব্যবহৃত হয়। আসুন, আমরা এই দুটি কৌশল এবং তাদের ব্যবহার উদাহরণসহ বুঝে দেখি।
Native Query হলো ডেটাবেজের SQL স্টাইল ব্যবহার করে কোয়েরি করার পদ্ধতি। যখন JPA বা Hibernate এর মাধ্যমে সাধারণ JPQL (Java Persistence Query Language) দিয়ে ডেটাবেজে প্রশ্ন করা হয় না, তখন Native SQL ব্যবহার করা হয়।
Native Query SQL স্টাইলের কোয়েরি ব্যবহার করতে সক্ষম করে, যেমন যে SQL কোয়েরি ডেটাবেজের জন্য বিশেষভাবে তৈরি করা হয়েছে।
ধরা যাক আমাদের একটি 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 হলো JPA-এর একটি বৈশিষ্ট্য, যা কোয়েরি লেখার জন্য নির্দিষ্ট নাম ব্যবহার করে এবং একটি কেন্দ্রীয় স্থান থেকে (যেমন Entity ক্লাসের মধ্যে) সেই কোয়েরি রেজিস্টার করে। Named Query ব্যবহার করার সময় কোয়েরি লিখে তা Entity ক্লাসের মধ্যে @Query
অ্যানোটেশন বা @NamedQuery
অ্যানোটেশন ব্যবহার করে সংজ্ঞায়িত করা হয়।
ধরা যাক, আমাদের একটি 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 Query | Named Query |
---|---|---|
কোয়েরি ধরনের স্টাইল | SQL কোয়েরি (ডেটাবেজ নির্দিষ্ট) | JPQL (Java Persistence Query Language) |
কোড লেখার স্থান | কোডে সরাসরি কোয়েরি লেখা হয় | Entity ক্লাসে কোয়েরি সংজ্ঞায়িত করা হয় |
পারফরম্যান্স | সাধারণত দ্রুত, কিন্তু ডেটাবেজ নির্ভর | ডেটাবেজ নিরপেক্ষ, তবে কিছু পরিস্থিতিতে ধীর হতে পারে |
ডেটাবেজ নির্ভরতা | ডেটাবেজ নির্দিষ্ট (RDBMS নির্ভর) | ডেটাবেজ নিরপেক্ষ (JPA নির্ভর) |
উপযোগিতা | বিশেষ SQL ফিচার ব্যবহার করার সময় | JPQL বা সাধারণ ডেটাবেজ অপারেশন করার সময় |
Read more