JPA (Java Persistence API) একটি শক্তিশালী API যা Java অ্যাপ্লিকেশনগুলির জন্য অবজেক্ট-অরিয়েন্টেড ডেটাবেস ইন্টারঅ্যাকশন সরবরাহ করে। সাধারণত, JPA তে JPQL (Java Persistence Query Language) ব্যবহার করে ডেটা অ্যাক্সেস করা হয়, তবে কিছু পরিস্থিতিতে, বিশেষ করে যখন ডেটাবেস নির্দিষ্ট কুয়েরি বা অপ্টিমাইজড কুয়েরি প্রয়োজন হয়, তখন Native SQL Queries ব্যবহার করা হয়ে থাকে।
Native SQL Queries হল সেই SQL কুয়েরি যা ডেটাবেস নির্দিষ্ট এবং JPA এর স্বাভাবিক JPQL কুয়েরির বাইরে থাকে। এটি ডেটাবেসের আসল SQL ভাষায় লেখা হয় এবং EntityManager এর মাধ্যমে চালানো হয়।
EntityManager ব্যবহার করে Native SQL Query চালানো হয়। Native SQL Query চালানোর জন্য 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> 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();
}
}
এখানে, একটি Native SQL Query ব্যবহার করা হয়েছে যা Employee টেবিল থেকে সকল কর্মচারী নির্বাচন করবে, যাদের salary একটি নির্দিষ্ট মানের বেশি।
যদি আপনি Native SQL Query ব্যবহার করে কিছু নির্দিষ্ট ডেটা ফেরত পেতে চান, কিন্তু Entity ক্লাসে সেই ডেটা ম্যাপ করতে চান না, তাহলে createNativeQuery()
এর মাধ্যমে আপনি সোজাসুজি Object Array বা 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[] রিটার্ন হচ্ছে যেখানে প্রতিটি Array এর মধ্যে name
এবং salary
ফিল্ড থাকবে। এই ক্ষেত্রে Entity ক্লাসের Mapping প্রয়োজন নেই।
Native SQL Query তে আপনি Aggregation Functions যেমন COUNT
, SUM
, AVG
, MAX
, MIN
ইত্যাদি ব্যবহার করতে পারেন। যেমন:
public long getEmployeeCountByDepartment(String department) {
String sql = "SELECT COUNT(*) FROM Employee WHERE department = :department";
Query query = entityManager.createNativeQuery(sql);
query.setParameter("department", department);
return ((Number) query.getSingleResult()).longValue();
}
এখানে, আমরা COUNT ফাংশন ব্যবহার করে একটি নির্দিষ্ট department এর Employee সংখ্যা গণনা করছি।
JPA তে Named Native Queries আপনি @Query অ্যানোটেশন ব্যবহার করে Entity ক্লাসের মধ্যে ডিফাইন করতে পারেন, যাতে কোডে আরো পরিষ্কার এবং রক্ষণাবেক্ষণযোগ্য থাকে।
@Entity
@NamedNativeQuery(name = "Employee.findByDepartment",
query = "SELECT * FROM Employee WHERE department = :department",
resultClass = Employee.class)
public class Employee {
// Entity class definition
}
এখন, আপনি NamedNativeQuery ব্যবহার করে নিচের মতো ডেটা পেতে পারেন:
Query query = entityManager.createNamedQuery("Employee.findByDepartment");
query.setParameter("department", "HR");
List<Employee> employees = query.getResultList();
Native SQL Query তে পেজিনেশন (paginated queries) ব্যবহারের জন্য setFirstResult()
এবং setMaxResults()
ব্যবহার করা যায়।
String sql = "SELECT * FROM Employee WHERE department = :department";
Query query = entityManager.createNativeQuery(sql, Employee.class);
query.setParameter("department", "IT");
query.setFirstResult(0); // Start from the first result
query.setMaxResults(10); // Limit the number of results
List<Employee> employees = query.getResultList();
এখানে, আমরা পেজিনেশন করে IT ডিপার্টমেন্টের প্রথম 10 কর্মচারী নির্বাচিত করেছি।
Native SQL Queries JPA তে একটি শক্তিশালী উপায় যা আপনাকে ডেটাবেস নির্দিষ্ট কুয়েরি লেখার সুযোগ দেয়। এটি যখন JPQL সীমাবদ্ধ থাকে বা ডেটাবেসের নির্দিষ্ট ফিচার প্রয়োজন হয়, তখন কার্যকরী হয়। Native SQL তে complex SQL কুয়েরি, joins, aggregation ফাংশন, এবং পেজিনেশন ব্যবহার করা যায় যা ডেটাবেসের পারফরম্যান্স অপটিমাইজেশন করতে সাহায্য করে।
JPA (Java Persistence API) তে Native Queries চালানোর প্রক্রিয়া একটি শক্তিশালী উপায় যা আপনাকে ডেটাবেস নির্দিষ্ট SQL কুয়েরি চালানোর সুযোগ দেয়, বিশেষ করে যখন JPQL (Java Persistence Query Language) সীমাবদ্ধ হয়ে যায় অথবা আপনি ডেটাবেসের নিজস্ব ফিচার ব্যবহার করতে চান। Native SQL কুয়েরি EntityManager ব্যবহার করে চালানো হয় এবং এটি ডেটাবেসের আসল SQL সিনট্যাক্স ব্যবহার করে।
JPA তে Native SQL Query চালানোর জন্য EntityManager এর createNativeQuery()
মেথড ব্যবহার করা হয়। EntityManager কুয়েরি চালানোর জন্য একটি API প্রদান করে যা Native SQL কুয়েরি লেখার এবং ফলাফল পাওয়ার জন্য ব্যবহৃত হয়।
createNativeQuery()
মেথড ব্যবহার করুন।এই প্রক্রিয়ায়, আমরা 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)
প্যারামিটারটি সেট করে কাজ করা হয়েছে।যখন আপনি 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 হবে।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();
}
এখানে:
getSingleResult()
মেথড ব্যবহার করে একটি একক মান (গড় salary) ফেরত পেয়েছি।যখন আপনার 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()
মেথড ব্যবহার করে আমরা প্যারামিটারটি পাস করেছি।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 JPA তে ডেটাবেস নির্দিষ্ট কুয়েরি চালানোর একটি কার্যকরী উপায়। এটি EntityManager ব্যবহার করে createNativeQuery() মেথডের মাধ্যমে তৈরি করা হয় এবং এটি ডেটাবেসের আসল SQL সিনট্যাক্স ব্যবহার করে। Native SQL Queries JPQL এর তুলনায় অধিক কার্যকরী হতে পারে যখন complex joins, aggregation functions, window functions, বা database-specific features দরকার হয়। তবে, এর কিছু সীমাবদ্ধতা রয়েছে, যেমন এটি ডেটাবেস নির্ভরশীল, এবং জেপিএ এর automatic object mapping সুবিধাগুলি সরবরাহ করে না।
JPA (Java Persistence API)-তে ডেটা অ্যাক্সেস করতে প্রধানত JPQL (Java Persistence Query Language) এবং Native SQL Queries ব্যবহার করা হয়। @Query এবং EntityManager.createNativeQuery() দুটি গুরুত্বপূর্ণ টুল যা ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করতে ব্যবহৃত হয়।
এখানে আমরা @Query এবং EntityManager.createNativeQuery() এর ব্যবহার এবং পার্থক্য নিয়ে বিস্তারিত আলোচনা করব।
@Query অ্যানোটেশন Spring Data JPA তে ব্যবহৃত হয় এবং এটি ডেটাবেসে JPQL বা Native SQL কুয়েরি চালানোর জন্য ব্যবহার করা হয়। যখন আপনি Spring Data JPA Repository ব্যবহার করেন, তখন @Query অ্যানোটেশনটি আপনার কাস্টম কুয়েরি সংজ্ঞায়িত করতে সাহায্য করে।
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);
}
এখানে:
Employee
Entity এর department ফিল্ডে ভিত্তি করে কর্মচারীদের তালিকা ফেরত দেওয়ার জন্য।@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);
}
এখানে:
EntityManager.createNativeQuery() JPA এর একটি মেথড যা Native SQL Queries চালানোর জন্য ব্যবহৃত হয়। এই মেথডটি আপনি যখন সরাসরি SQL কুয়েরি লিখতে চান বা ডেটাবেসের নির্দিষ্ট ফিচার ব্যবহার করতে চান তখন ব্যবহার করতে পারেন।
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();
}
}
এখানে:
:dept
প্যারামিটারটি সেট করা হয়েছে।কিছু ক্ষেত্রে, আপনি 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 (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 চালানোর জন্য ব্যবহৃত হয়।
যতটুকু সম্ভব JPQL ব্যবহার করার চেষ্টা করুন, তবে যখন Native SQL বা ডেটাবেস নির্দিষ্ট কুয়েরি প্রয়োজন হয়, তখন createNativeQuery() ব্যবহারের মাধ্যমে ডেটাবেসের শক্তিশালী ফিচার ব্যবহার করতে পারেন।
JPA (Java Persistence API) আপনাকে JPQL (Java Persistence Query Language) ব্যবহার করে Entity গুলির সাথে ইন্টারঅ্যাক্ট করার সুবিধা প্রদান করে। তবে, কিছু জটিল ডেটাবেস অপারেশন বা ডেটাবেস নির্দিষ্ট ফিচার (যেমন complex joins, subqueries, aggregate functions) ব্যবহার করার জন্য Native SQL Queries অত্যন্ত কার্যকরী হতে পারে। Native SQL Queries সরাসরি ডেটাবেসে SQL কুয়েরি পাঠানোর মাধ্যমে complex database operations সম্পাদন করতে সহায়তা করে।
JPA তে Native SQL Query ব্যবহার করার মাধ্যমে আপনি ডেটাবেসের কিছু জটিল অপারেশন খুব সহজেই করতে পারেন, যেমন:
এগুলো JPA তে Native SQL Query ব্যবহার করে কীভাবে করা যায়, তা নিচে বিস্তারিতভাবে দেখানো হবে।
Joins সাধারণত বিভিন্ন টেবিলের মধ্যে সম্পর্ক স্থাপন করতে ব্যবহৃত হয়। জটিল INNER JOIN, LEFT JOIN বা RIGHT JOIN ব্যবহারের মাধ্যমে আপনি একাধিক টেবিল থেকে ডেটা সংগ্রহ করতে পারেন।
ধরা যাক, আমাদের দুটি টেবিল Employee এবং Department রয়েছে এবং আমরা Employee
এবং Department
টেবিলের মধ্যে INNER 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[]> findEmployeeDepartmentDetails() {
// 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);
return query.getResultList(); // Execute the query and return the result
}
}
এখানে:
Employee
এবং Department
টেবিলের মধ্যে সম্পর্ক স্থাপন করা হয়েছে।Employee
এবং Department
এর নাম ও বেতন ফিরে আসবে)।Aggregate Functions ডেটার উপর সমষ্টিগত অপারেশন সম্পাদন করতে ব্যবহৃত হয়, যেমন রেকর্ডের সংখ্যা, সর্বোচ্চ/সর্বনিম্ন মান, গড় মান, ইত্যাদি।
ধরা যাক, আমরা Employee
টেবিলের মধ্যে গড় বেতন বের করতে চাই।
import javax.persistence.EntityManager;
import javax.persistence.Query;
public class EmployeeService {
private EntityManager entityManager;
public EmployeeService(EntityManager entityManager) {
this.entityManager = entityManager;
}
public double getAverageSalary() {
// Native SQL Query to calculate average salary
String sql = "SELECT AVG(salary) FROM Employee";
Query query = entityManager.createNativeQuery(sql);
return (Double) query.getSingleResult(); // Return the average salary
}
}
এখানে:
Employee
টেবিলের গড় বেতন বের করা হয়েছে।Subqueries একাধিক কুয়েরির মধ্যে একটি কুয়েরি হতে পারে, যা আরেকটি কুয়েরির ফলাফল ব্যবহার করে। Subqueries জটিল ডেটাবেস অপারেশন করার জন্য ব্যবহার করা হয়, যেখানে একটি কুয়েরির রেজাল্ট অন্য কুয়েরির শর্ত হিসেবে ব্যবহৃত হয়।
ধরা যাক, আমরা সেই Employee
গুলি খুঁজতে চাই যাদের বেতন গড় বেতনের চেয়ে বেশি।
import javax.persistence.EntityManager;
import javax.persistence.Query;
public class EmployeeService {
private EntityManager entityManager;
public EmployeeService(EntityManager entityManager) {
this.entityManager = entityManager;
}
public List<Employee> findEmployeesWithSalaryGreaterThanAverage() {
// Native SQL Query with Subquery
String sql = "SELECT * FROM Employee e WHERE e.salary > " +
"(SELECT AVG(salary) FROM Employee)";
Query query = entityManager.createNativeQuery(sql, Employee.class);
return query.getResultList(); // Execute the query and return the result
}
}
এখানে:
Employee
গুলি ফেরত দেবে।GROUP BY এবং HAVING SQL ফিচার দুটি সাধারণত ডেটাকে গ্রুপ করা এবং একটি শর্তের ভিত্তিতে ডেটা ফিল্টার করার জন্য ব্যবহৃত হয়।
ধরা যাক, আমরা Department
অনুযায়ী Employee এর গড় বেতন বের করতে চাই, এবং শুধুমাত্র যেখানে গড় বেতন ৫০,০০০ এর বেশি।
import javax.persistence.EntityManager;
import javax.persistence.Query;
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 d.name, AVG(e.salary) FROM Employee e " +
"INNER JOIN Department d ON e.department_id = d.id " +
"GROUP BY d.name HAVING AVG(e.salary) > 50000";
Query query = entityManager.createNativeQuery(sql);
return query.getResultList(); // Execute the query and return the result
}
}
এখানে:
Department
অনুযায়ী গ্রুপিং করার জন্য।JPA (Java Persistence API) তে Native SQL Queries ব্যবহার করে ডেটা এক্সট্র্যাকশন (Data Extraction) করতে হয়, যখন আপনি JPQL বা Criteria API এর মাধ্যমে যে সমস্ত কুয়েরি বা অপারেশন করতে পারেন না, সেই ক্ষেত্রে Native SQL Queries কার্যকরী হয়ে ওঠে। এটি ডেটাবেস নির্দিষ্ট কুয়েরি বা অপটিমাইজড SQL ফিচারের জন্য ব্যবহৃত হয়।
নিম্নলিখিত উদাহরণগুলোতে আমরা দেখব কীভাবে Native SQL Queries ব্যবহার করে ডেটা এক্সট্র্যাকশন করা যায়।
ধরা যাক, আমাদের একটি Employee Entity আছে এবং আমরা Employee
টেবিল থেকে সমস্ত কর্মচারীকে বের করতে চাই, কিন্তু এই কুয়েরি Native SQL তে হবে।
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;
}
}
এখন, আমরা 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
}
}
ব্যাখ্যা:
Employee
টেবিলের ডেটা Java Object হিসেবে ম্যাপ হয়।ধরা যাক, আমরা Employee টেবিল থেকে department অনুযায়ী গড় বেতন বের করতে চাই, এবং 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
}
}
ব্যাখ্যা:
এই কুয়েরি ব্যবহারের মাধ্যমে, আপনি department এবং গড় বেতন জানিয়ে বিভিন্ন বিভাগে কর্মচারীদের গড় বেতন বের করতে পারবেন।
আমরা যদি Employee টেবিলের ডেটা পেজিনেশন করতে চাই, তবে Native SQL Query এর মাধ্যমে তা করা সম্ভব। এখানে আমরা প্রথম ৫টি কর্মচারী দেখতে চাই, যারা HR বিভাগে কর্মরত।
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
}
}
ব্যাখ্যা:
এখানে, HR ডিপার্টমেন্টের প্রথম ৫টি কর্মচারী ফেরত আসবে।
আমরা যদি Employee এবং Department টেবিলের মধ্যে JOIN করতে চাই, তবে 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<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
}
}
ব্যাখ্যা:
Employee
এবং Department
টেবিলের মধ্যে INNER JOIN ব্যবহার করা হয়েছে।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