JPA (Java Persistence API) তে Native SQL Queries ব্যবহার করে ডেটা এক্সট্র্যাকশন (Data Extraction) করতে হয়, যখন আপনি JPQL বা Criteria API এর মাধ্যমে যে সমস্ত কুয়েরি বা অপারেশন করতে পারেন না, সেই ক্ষেত্রে Native SQL Queries কার্যকরী হয়ে ওঠে। এটি ডেটাবেস নির্দিষ্ট কুয়েরি বা অপটিমাইজড SQL ফিচারের জন্য ব্যবহৃত হয়।
নিম্নলিখিত উদাহরণগুলোতে আমরা দেখব কীভাবে Native SQL Queries ব্যবহার করে ডেটা এক্সট্র্যাকশন করা যায়।
প্রথম উদাহরণ: Native Query দিয়ে Employee List Extraction
ধরা যাক, আমাদের একটি Employee Entity আছে এবং আমরা Employee টেবিল থেকে সমস্ত কর্মচারীকে বের করতে চাই, কিন্তু এই কুয়েরি Native SQL তে হবে।
Step 1: Employee Entity
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Employee {
@Id
private Long id;
private String name;
private double salary;
private String department;
// Getter and Setter Methods
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 double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
Step 2: Native SQL Query for Employee List
এখন, আমরা Native SQL Query ব্যবহার করে Employee টেবিল থেকে সমস্ত কর্মচারীর নাম এবং বেতন বের করতে চাই।
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> getAllEmployees() {
// Native SQL Query to fetch all employees
String sql = "SELECT * FROM Employee";
Query query = entityManager.createNativeQuery(sql, Employee.class);
// Fetching results as List of Employee objects
return query.getResultList(); // Execute the query and return the result
}
}
ব্যাখ্যা:
- createNativeQuery: এটি Native SQL Query তৈরি করতে ব্যবহৃত হয় এবং ডেটাবেসের আসল SQL ব্যবহার করতে সহায়তা করে।
- Employee.class: এটি Entity ক্লাস, যার মাধ্যমে
Employeeটেবিলের ডেটা Java Object হিসেবে ম্যাপ হয়। - getResultList(): এটি Native Query এর রেজাল্টের লিস্ট ফেরত দেয়।
দ্বিতীয় উদাহরণ: Native SQL Query দিয়ে Aggregate Data Extraction
ধরা যাক, আমরা Employee টেবিল থেকে department অনুযায়ী গড় বেতন বের করতে চাই, এবং HAVING ক্লজ ব্যবহার করে শুধুমাত্র সেই বিভাগের কর্মচারী গুলি দেখতে চাই যাদের গড় বেতন ৫০,০০০ টাকার বেশি।
Step 1: Aggregate Query with Group By and Having
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.List;
import java.util.Object;
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 department, AVG(salary) FROM Employee " +
"GROUP BY department HAVING AVG(salary) > 50000";
Query query = entityManager.createNativeQuery(sql);
// Fetching aggregated data
return query.getResultList(); // Execute the query and return the result
}
}
ব্যাখ্যা:
- AVG(salary): গড় বেতন বের করার জন্য AVG aggregate function ব্যবহার করা হয়েছে।
- GROUP BY: ডেটা department অনুযায়ী গ্রুপ করা হয়েছে।
- HAVING: গড় বেতন ৫০,০০০ টাকার বেশি এমন বিভাগগুলিই ফিল্টার করা হয়েছে।
এই কুয়েরি ব্যবহারের মাধ্যমে, আপনি department এবং গড় বেতন জানিয়ে বিভিন্ন বিভাগে কর্মচারীদের গড় বেতন বের করতে পারবেন।
তৃতীয় উদাহরণ: Native SQL Query দিয়ে Employee Pagination
আমরা যদি Employee টেবিলের ডেটা পেজিনেশন করতে চাই, তবে Native SQL Query এর মাধ্যমে তা করা সম্ভব। এখানে আমরা প্রথম ৫টি কর্মচারী দেখতে চাই, যারা HR বিভাগে কর্মরত।
Step 1: Native Query with Pagination
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> getEmployeesByDepartmentWithPagination(String department) {
// Native SQL Query with Pagination
String sql = "SELECT * FROM Employee WHERE department = :department";
Query query = entityManager.createNativeQuery(sql, Employee.class);
query.setParameter("department", department);
query.setFirstResult(0); // Start from the first result
query.setMaxResults(5); // Limit the results to 5
return query.getResultList(); // Fetch the paginated results
}
}
ব্যাখ্যা:
- setFirstResult(0): এটি প্রথম ৫টি রেকর্ড থেকে শুরু করবে (যেহেতু আমরা ৫টি রেকর্ডের জন্য সিলেক্ট করেছি)।
- setMaxResults(5): এটি ৫টি রেকর্ডে সীমাবদ্ধ করবে, অর্থাৎ, পেজিনেশন এর মাধ্যমে ৫টি কর্মচারী রিটার্ন করবে।
এখানে, HR ডিপার্টমেন্টের প্রথম ৫টি কর্মচারী ফেরত আসবে।
চতুর্থ উদাহরণ: Native SQL Query with JOINs
আমরা যদি Employee এবং Department টেবিলের মধ্যে JOIN করতে চাই, তবে Native SQL Query এর মাধ্যমে তা করা যাবে।
Step 1: Native SQL Query with 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[]> getEmployeeDepartmentDetails() {
// 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);
// Fetching employee name, salary, and department name
return query.getResultList(); // Execute the query and return the result
}
}
ব্যাখ্যা:
- INNER JOIN:
EmployeeএবংDepartmentটেবিলের মধ্যে INNER JOIN ব্যবহার করা হয়েছে। - Object[]: রিটার্ন টাইপ
Object[]কারণ একাধিক কলাম (যেমন,Employeeএর নাম, বেতন এবংDepartmentএর নাম) একত্রে রিটার্ন করা হচ্ছে।
এটি Employee টেবিল এবং Department টেবিলের সংযুক্ত ডেটা (employee name, salary, department name) রিটার্ন করবে।
সারাংশ
Native SQL Queries JPA তে ডেটাবেস নির্দিষ্ট কুয়েরি এবং জটিল অপারেশন করার জন্য শক্তিশালী উপায়। আপনি joins, aggregation functions, subqueries, এবং pagination এর মতো কমপ্লেক্স ডেটাবেস অপারেশন Native SQL Query ব্যবহার করে সহজেই করতে পারেন। এগুলির মাধ্যমে আপনি ডেটাবেসের বিশেষ ক্ষমতাগুলো ব্যবহার করে ডেটা এক্সট্র্যাকশন করতে পারেন। EntityManager এর মাধ্যমে createNativeQuery() মেথড ব্যবহার করে Native Queries চালানো হয় এবং আপনি সহজেই Entity, Object[] অথবা DTO তে রেজাল্ট ম্যাপ করতে পারেন।
Read more