JPA (Java Persistence API)-তে ডেটা অ্যাক্সেস করতে প্রধানত JPQL (Java Persistence Query Language) এবং Native SQL Queries ব্যবহার করা হয়। @Query এবং EntityManager.createNativeQuery() দুটি গুরুত্বপূর্ণ টুল যা ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করতে ব্যবহৃত হয়।
- @Query: এটি Spring Data JPA এ ব্যবহৃত হয়, যেখানে আপনি JPQL বা SQL কুয়েরি লিখে ডেটাবেস অ্যাক্সেস করতে পারেন।
- EntityManager.createNativeQuery(): এটি JPA এর একটি মেথড যা Native SQL Queries চালানোর জন্য ব্যবহৃত হয়, যেখানে সরাসরি ডেটাবেসের আসল SQL ব্যবহার করা হয়।
এখানে আমরা @Query এবং EntityManager.createNativeQuery() এর ব্যবহার এবং পার্থক্য নিয়ে বিস্তারিত আলোচনা করব।
@Query এর ব্যবহার
@Query অ্যানোটেশন Spring Data JPA তে ব্যবহৃত হয় এবং এটি ডেটাবেসে JPQL বা Native SQL কুয়েরি চালানোর জন্য ব্যবহার করা হয়। যখন আপনি Spring Data JPA Repository ব্যবহার করেন, তখন @Query অ্যানোটেশনটি আপনার কাস্টম কুয়েরি সংজ্ঞায়িত করতে সাহায্য করে।
@Query উদাহরণ (JPQL)
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import java.util.List;
public interface EmployeeRepository extends CrudRepository<Employee, Long> {
// JPQL query example using @Query annotation
@Query("SELECT e FROM Employee e WHERE e.department = :department")
List<Employee> findEmployeesByDepartment(String department);
}
এখানে:
- @Query ব্যবহার করা হয়েছে
EmployeeEntity এর department ফিল্ডে ভিত্তি করে কর্মচারীদের তালিকা ফেরত দেওয়ার জন্য। - এটি JPQL কুয়েরি, যেখানে Employee একটি Entity ক্লাস এবং department একটি ফিল্ড।
@Query উদাহরণ (Native SQL)
@Query অ্যানোটেশনটি Native SQL কুয়েরি ব্যবহারের জন্যও ব্যবহৃত হতে পারে, যেমন:
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import java.util.List;
public interface EmployeeRepository extends CrudRepository<Employee, Long> {
// Native SQL query example using @Query annotation
@Query(value = "SELECT * FROM Employee WHERE department = :department", nativeQuery = true)
List<Employee> findEmployeesByDepartmentNative(String department);
}
এখানে:
- nativeQuery = true ব্যবহৃত হয়েছে যাতে Spring Data JPA জানে যে এটি একটি Native SQL কুয়েরি।
- SELECT * FROM Employee এক্সাক্ট SQL কুয়েরি যা Employee টেবিল থেকে ডেটা ফেরত দেবে।
EntityManager.createNativeQuery() এর ব্যবহার
EntityManager.createNativeQuery() JPA এর একটি মেথড যা Native SQL Queries চালানোর জন্য ব্যবহৃত হয়। এই মেথডটি আপনি যখন সরাসরি SQL কুয়েরি লিখতে চান বা ডেটাবেসের নির্দিষ্ট ফিচার ব্যবহার করতে চান তখন ব্যবহার করতে পারেন।
EntityManager.createNativeQuery() উদাহরণ
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> findEmployeesByDepartment(String department) {
// Native SQL query to fetch employees by department
String sql = "SELECT * FROM Employee WHERE department = :dept";
// Create Native Query
Query query = entityManager.createNativeQuery(sql, Employee.class);
query.setParameter("dept", department);
// Execute the query and return results
return query.getResultList();
}
}
এখানে:
- createNativeQuery() ব্যবহার করা হয়েছে Native SQL কুয়েরি তৈরি করতে।
- Employee.class ব্যবহার করা হয়েছে ফলাফল হিসেবে Employee Entity ফিরিয়ে দেওয়ার জন্য।
- setParameter() ব্যবহার করে
:deptপ্যারামিটারটি সেট করা হয়েছে।
EntityManager.createNativeQuery() এর সাথে Object Mapping
কিছু ক্ষেত্রে, আপনি Native SQL কুয়েরি থেকে Object রিটার্ন করতে পারেন। এর জন্য, আপনি resultClass বা Object[] ব্যবহার করতে পারেন।
public List<Object[]> findEmployeeNamesAndSalaries() {
String sql = "SELECT name, salary FROM Employee";
// Create Native Query
Query query = entityManager.createNativeQuery(sql);
// Execute the query and return results
return query.getResultList();
}
এখানে, SQL কুয়েরি name এবং salary ফিল্ডের মান দিচ্ছে, এবং ফলাফলটি Object[] হিসেবে ফেরত দিচ্ছে।
@Query এবং EntityManager.createNativeQuery() এর পার্থক্য
| বৈশিষ্ট্য | @Query (Spring Data JPA) | EntityManager.createNativeQuery() |
|---|---|---|
| ব্যবহার | Spring Data JPA এর Repository তে কাস্টম কুয়েরি লেখার জন্য ব্যবহৃত হয় | JPA এর EntityManager এর মাধ্যমে Native SQL কুয়েরি চালানোর জন্য |
| JPQL বা Native SQL | JPQL বা Native SQL, উভয়ই সমর্থিত | মূলত Native SQL কুয়েরি ব্যবহৃত হয় |
| ডেটা মডেল ম্যাপিং | JPQL কুয়েরি Entity ক্লাসে রূপান্তরিত হয় | Native SQL কুয়েরি Entity বা ResultSet-এ রূপান্তরিত হয় |
| সহজ ইন্টিগ্রেশন | Spring Data JPA Repository এবং @Query খুব সহজে ইন্টিগ্রেট করা যায় | EntityManager এবং Native SQL Query এর সাথে কোড লেখা কিছুটা জটিল |
| ফ্লেক্সিবিলিটি | @Query ডেটাবেস ইন্টারঅ্যাকশন কাস্টমাইজেশন সহজ করে | Native SQL Queries ডেটাবেস নির্দিষ্ট কাস্টমাইজেশন বেশি সক্ষম |
সারাংশ
@Query এবং EntityManager.createNativeQuery() দুইটি গুরুত্বপূর্ণ উপায় যা JPA তে Native SQL Queries চালানোর জন্য ব্যবহৃত হয়।
- @Query অ্যানোটেশন Spring Data JPA ব্যবহারকারীদের জন্য সহজে JPQL বা Native SQL কুয়েরি চালানোর সুযোগ দেয়।
- EntityManager.createNativeQuery() Java EE তে JPA ব্যবহার করে Native SQL কুয়েরি চালানোর জন্য সরাসরি ব্যবহৃত হয়, এবং এতে আপনি Entity বা Object[] রিটার্ন করতে পারেন।
যতটুকু সম্ভব JPQL ব্যবহার করার চেষ্টা করুন, তবে যখন Native SQL বা ডেটাবেস নির্দিষ্ট কুয়েরি প্রয়োজন হয়, তখন createNativeQuery() ব্যবহারের মাধ্যমে ডেটাবেসের শক্তিশালী ফিচার ব্যবহার করতে পারেন।
Read more