Spring Boot JPA (Java Persistence API) হল Spring Framework এর একটি শক্তিশালী অংশ যা ডেটাবেস অপারেশন সহজভাবে পরিচালনা করতে সাহায্য করে। Spring Data JPA স্বয়ংক্রিয়ভাবে ডেটাবেসের CRUD (Create, Read, Update, Delete) অপারেশন পরিচালনা করে, এবং এর মাধ্যমে ডেভেলপাররা Repository Interface ব্যবহার করে ডেটাবেসের সঙ্গে যোগাযোগ করতে পারে।
Spring Boot JPA তে Query Methods এবং Custom Queries ব্যবহার করে ডেটাবেসের সাথে আরও জটিল অপারেশন সম্পাদন করা সম্ভব।
Spring Data JPA তে Query Methods ব্যবহার করে আপনি সহজভাবে বিভিন্ন ডেটাবেস প্রশ্ন (queries) তৈরি করতে পারেন, যেখানে Spring ডেটাবেস কুয়েরি সৃষ্টির জন্য মেথড নাম ব্যবহার করে।
Spring Data JPA তে Query Methods সাধারণত Repository Interface তে ডিফাইন করা হয় এবং method নামের ভিত্তিতে JPQL (Java Persistence Query Language) তৈরি করা হয়।
ধরা যাক, আমাদের একটি User
Entity আছে এবং আমরা User
Entity থেকে নামের ভিত্তিতে ব্যবহারকারী খুঁজে পেতে চাই।
User
Entity:package com.example.model;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class User {
@Id
private Long id;
private String name;
private String email;
// Getters and Setters
}
UserRepository
Interface:Spring Data JPA তে UserRepository
Interface তৈরি করে, আমরা ডেটাবেসে পছন্দসই কার্যক্রম সঞ্চালন করতে পারি।
package com.example.repository;
import com.example.model.User;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface UserRepository extends JpaRepository<User, Long> {
// Query Method to find users by name
List<User> findByName(String name);
// Query Method to find users by email
User findByEmail(String email);
}
এখানে, findByName
এবং findByEmail
মেথডগুলি Spring Data JPA এর Query Method যা JPQL কুয়েরি তৈরি করবে User
Entity থেকে ডেটা ফেচ করার জন্য। findByName
মেথডটি name
প্রপার্টির ভিত্তিতে ব্যবহারকারী খুঁজে বের করবে, এবং findByEmail
মেথডটি ইমেইল দিয়ে ব্যবহারকারী খুঁজে বের করবে।
Spring Data JPA-তে, আপনি query method names এর মাধ্যমে JPQL কুয়েরি তৈরি করতে পারেন। এর মাধ্যমে সহজভাবে কুয়েরি তৈরির জন্য কিছু কনভেনশন রয়েছে:
List<User> findByNameAndEmail(String name, String email); // Find by both name and email
long countByName(String name); // Count number of users by name
boolean existsByEmail(String email); // Check if user exists by email
Spring Data JPA method name parsing এর মাধ্যমে, এগুলো সঠিক JPQL কুয়েরিতে রূপান্তরিত হবে।
যখন Query Methods যথেষ্ট না হয় বা আপনি জটিল কুয়েরি করতে চান, তখন Custom Queries ব্যবহার করা হয়। Custom Queries তৈরি করার জন্য, আপনি @Query
অ্যানোটেশন ব্যবহার করতে পারেন, যা JPQL বা SQL কুয়েরি লেখা সহজ করে।
Spring Data JPA তে @Query
অ্যানোটেশন ব্যবহার করে আপনি কাস্টম কুয়েরি তৈরি করতে পারেন। এখানে আমরা JPQL (Java Persistence Query Language) বা native SQL কুয়েরি ব্যবহার করতে পারি।
package com.example.repository;
import com.example.model.User;
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> {
@Query("SELECT u FROM User u WHERE u.name = :name")
List<User> findUsersByName(@Param("name") String name);
}
এখানে, @Query
অ্যানোটেশন ব্যবহার করে JPQL কুয়েরি তৈরি করা হয়েছে। এটি User
Entity থেকে name
এর ভিত্তিতে ব্যবহারকারী খুঁজে বের করবে।
Spring Data JPA তে, আপনি যদি native SQL ব্যবহার করতে চান, তবে nativeQuery = true
প্যারামিটারটি ব্যবহার করতে হবে।
@Query(value = "SELECT * FROM user WHERE email = :email", nativeQuery = true)
User findUserByEmail(@Param("email") String email);
এখানে, nativeQuery = true
ব্যবহার করে native SQL কুয়েরি ব্যবহার করা হয়েছে, যা ডেটাবেসের প্রকৃত টেবিল থেকে ডেটা ফেচ করবে।
Spring Data JPA তে Paging এবং Sorting সমর্থিত। আপনি Pageable
এবং Sort
ব্যবহার করে কুয়েরি এবং ডেটা ফেরত পেতে পারেন।
@Query("SELECT u FROM User u WHERE u.name LIKE :name")
Page<User> findByNameWithPagination(@Param("name") String name, Pageable pageable);
এখানে, findByNameWithPagination
মেথডটি পেজিং ও সোর্টিং সহ name
অনুসারে ব্যবহারকারী খুঁজে বের করবে।
Spring Data JPA তে Criteria API ব্যবহার করে আরও ডাইনামিক কুয়েরি তৈরি করা সম্ভব। এটি আপনি JPA CriteriaBuilder এর মাধ্যমে করতে পারেন, যা Java code ব্যবহার করে ডাইনামিক কুয়েরি তৈরি করতে সহায়তা করে।
package com.example.repository;
import com.example.model.User;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.List;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findAll(Specification<User> spec);
static Specification<User> hasName(String name) {
return new Specification<User>() {
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
return criteriaBuilder.equal(root.get("name"), name);
}
};
}
}
এখানে, Criteria API ব্যবহার করে ডাইনামিক কুয়েরি তৈরি করা হয়েছে, যা name
এর ভিত্তিতে User
খুঁজে বের করবে।
Spring Boot JPA তে Query Methods এবং Custom Queries ব্যবহারের মাধ্যমে ডেটাবেস অপারেশনগুলো আরো সহজ এবং শক্তিশালী করা যায়। Query Methods ব্যবহার করে আপনি সহজভাবে জিপিকিউএল কুয়েরি তৈরি করতে পারেন, আর Custom Queries ব্যবহার করে @Query অ্যানোটেশন বা Native SQL কুয়েরি ব্যবহার করতে পারেন। Criteria API ব্যবহারের মাধ্যমে আরো ডাইনামিক কুয়েরি তৈরি করা সম্ভব। Spring Data JPA আপনাকে জটিল কুয়েরি তৈরি এবং কার্যকরীভাবে ডেটাবেস ম্যানেজমেন্ট করার সুযোগ দেয়।
Query Methods হল Spring Data JPA এর একটি বৈশিষ্ট্য যা আপনাকে ডেটাবেস থেকে ডেটা অনুসন্ধান করতে সহজ এবং টেমপ্লেট পদ্ধতিতে কাস্টম কুয়েরি তৈরি করতে সহায়তা করে। Spring Data JPA স্বয়ংক্রিয়ভাবে Query Methods তৈরি করে, যেগুলি মূলত method names এর ভিত্তিতে ডাইনামিক SQL কুয়েরি তৈরি করে। এগুলির মাধ্যমে, আপনি Java method names ব্যবহার করে ডেটাবেস থেকে ডেটা রিট্রিভ বা ফিল্টার করতে পারেন, এবং এর জন্য কোন নির্দিষ্ট SQL কুয়েরি লেখার দরকার নেই।
স্প্রিং ডেটা জেপিএ (Spring Data JPA) এ Query Methods সাধারণত Repository ইন্টারফেসে ডিফাইন করা হয়, যেখানে মেথডের নামের ভিত্তিতে ডেটাবেস কুয়েরি তৈরি হয়। স্প্রিং এটি স্বয়ংক্রিয়ভাবে বিশ্লেষণ করে এবং উপযুক্ত SQL কুয়েরি তৈরি করে।
Spring Data JPA-তে Query Methods তৈরি করার জন্য, JpaRepository বা CrudRepository এর মাধ্যমে একটি ইন্টারফেস তৈরি করতে হয়। এই ইন্টারফেসের মধ্যে আপনি ডেটা ফিল্টারিং, খোঁজা এবং ডেটাবেস অপারেশনগুলো সহজেই নির্ধারণ করতে পারেন।
Query Methods এর নাম অনুসারে স্প্রিং কন্টেইনার স্বয়ংক্রিয়ভাবে কুয়েরি তৈরি করে। উদাহরণস্বরূপ, findBy
, findAllBy
, deleteBy
ইত্যাদি ব্যবহার করে ডেটাবেস অপারেশন করা যায়।
ধরা যাক, আমাদের একটি User
Entity ক্লাস রয়েছে এবং আমরা একটি UserRepository
ইন্টারফেস তৈরি করব, যাতে বিভিন্ন ডেটাবেস অপারেশন করা যায়।
User
Entity ক্লাস তৈরি করাimport javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
private String email;
// Constructor, Getters and Setters
public User(String name, String email) {
this.name = name;
this.email = email;
}
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;
}
}
UserRepository
ইন্টারফেস তৈরি করাSpring Data JPA এর JpaRepository বা CrudRepository ইন্টারফেস থেকে এক্সটেন্ড করে আপনি Query Methods ব্যবহার করতে পারেন।
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
// Query method to find a user by name
User findByName(String name);
// Query method to find a user by email
User findByEmail(String email);
// Query method to find users by name and email
List<User> findByNameAndEmail(String name, String email);
// Query method to find all users whose name starts with a specific prefix
List<User> findByNameStartingWith(String prefix);
// Query method to delete a user by email
void deleteByEmail(String email);
}
এখানে:
findByName
: স্প্রিং একটি SQL কুয়েরি তৈরি করবে যা User
টেবিলের name
কলামের সাথে মিলে এমন একটি রেকর্ড খুঁজে বের করবে।findByEmail
: একইভাবে, এটি email
এর উপর ভিত্তি করে ডেটা খুঁজে বের করবে।findByNameAndEmail
: এটি একাধিক প্যারামিটার (name এবং email) ব্যবহার করে ডেটা খুঁজবে।findByNameStartingWith
: name
এর সাথে শুরু হওয়া সব ব্যবহারকারী ফিরিয়ে দেবে।deleteByEmail
: email
এর মাধ্যমে ব্যবহারকারীকে মুছে ফেলবে।স্প্রিং ডেটা জেপিএ স্বয়ংক্রিয়ভাবে এই মেথডগুলির জন্য কুয়েরি তৈরি করে।
ডেটাবেসের সাথে কাজ করার জন্য একটি UserService
ক্লাস তৈরি করতে হবে, যেখানে আমরা UserRepository
থেকে মেথড কল করব।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
// Save a user
public void saveUser(User user) {
userRepository.save(user);
}
// Get a user by name
public User getUserByName(String name) {
return userRepository.findByName(name);
}
// Get all users with specific prefix
public List<User> getUsersByNamePrefix(String prefix) {
return userRepository.findByNameStartingWith(prefix);
}
// Delete a user by email
public void deleteUserByEmail(String email) {
userRepository.deleteByEmail(email);
}
}
এখন আমরা একটি UserController
তৈরি করব, যা HTTP রিকোয়েস্ট হ্যান্ডল করবে এবং UserService
থেকে মেথড কল করবে।
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 UserService userService;
// Endpoint to add a new user
@PostMapping("/add")
public String addUser(@RequestParam String name, @RequestParam String email) {
User user = new User(name, email);
userService.saveUser(user);
return "User added successfully!";
}
// Endpoint to get a user by name
@GetMapping("/findByName")
public User getUserByName(@RequestParam String name) {
return userService.getUserByName(name);
}
// Endpoint to get users by name prefix
@GetMapping("/findByNamePrefix")
public List<User> getUsersByNamePrefix(@RequestParam String prefix) {
return userService.getUsersByNamePrefix(prefix);
}
// Endpoint to delete a user by email
@DeleteMapping("/delete")
public String deleteUserByEmail(@RequestParam String email) {
userService.deleteUserByEmail(email);
return "User deleted successfully!";
}
}
এখানে আমরা বিভিন্ন HTTP রিকোয়েস্টের জন্য কন্ট্রোলার তৈরি করেছি, যেমন:
/add
: নতুন ব্যবহারকারী অ্যাড করার জন্য।/findByName
: নাম দিয়ে ব্যবহারকারী খোঁজার জন্য।/findByNamePrefix
: নামের প্রিফিক্স দিয়ে ব্যবহারকারী খোঁজার জন্য।/delete
: ইমেইল দিয়ে ব্যবহারকারী মুছে ফেলার জন্য।এখন @SpringBootApplication
অ্যানোটেশন ব্যবহার করে আমাদের প্রধান অ্যাপ্লিকেশন ক্লাস তৈরি করা হবে এবং অ্যাপ্লিকেশন চালানো হবে।
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootJpaApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootJpaApplication.class, args);
}
}
এটি স্প্রিং বুট অ্যাপ্লিকেশন শুরু করবে এবং ডেটাবেস সংযুক্ত করবে।
এখন আপনি আপনার Spring Boot অ্যাপ্লিকেশনটি চালু করতে পারেন এবং বিভিন্ন HTTP রিকোয়েস্টের মাধ্যমে ডেটা সঞ্চয়, অনুসন্ধান এবং মুছে ফেলতে পারবেন।
Add User:
POST http://localhost:8080/users/add?name=JohnDoe&email=johndoe@example.com
Find User by Name:
GET http://localhost:8080/users/findByName?name=JohnDoe
Find Users by Name Prefix:
GET http://localhost:8080/users/findByNamePrefix?prefix=John
Delete User by Email:
DELETE http://localhost:8080/users/delete?email=johndoe@example.com
Spring Data JPA এর Query Methods ব্যবহারের মাধ্যমে আপনি Spring Boot অ্যাপ্লিকেশনে সহজেই ডেটাবেস অপারেশন করতে পারেন। findBy
, findAllBy
, deleteBy
, ইত্যাদি পদ্ধতি ব্যবহার করে আপনি ডেটাবেস থেকে ডেটা অনুসন্ধান, আপডেট এবং মুছে ফেলতে পারেন, এবং এর জন্য কোনো কাস্টম SQL কুয়েরি লেখার প্রয়োজন হয় না। Spring Data JPA এই মেথডগুলোকে অটোমেটিক্যালি বিশ্লেষণ করে এবং উপযুক্ত SQL কুয়েরি তৈরি করে।
Spring Data JPA ডেটাবেস কুয়েরি তৈরি করার জন্য একটি শক্তিশালী এবং নমনীয় পদ্ধতি সরবরাহ করে যা Method Naming Convention ব্যবহার করে কাস্টম কুয়েরি তৈরি করতে সাহায্য করে। Spring Data JPA রেপোজিটরি ইন্টারফেসের মেথডের নাম অনুসারে কুয়েরি তৈরি করে, যার মাধ্যমে SQL কুয়েরি লিখতে হয় না। Spring Data JPA স্বয়ংক্রিয়ভাবে মেথডের নামের উপর ভিত্তি করে ডেটাবেস কুয়েরি তৈরি করে।
Spring Data JPA মেথডের নামের ভিত্তিতে কুয়েরি তৈরি করার জন্য কিছু নিয়ম অনুসরণ করে। এই নিয়মের মধ্যে find, read, get, count, exists, delete এবং update এর মতো কীওয়ার্ড ব্যবহার করা হয়। মেথডের নামের বিভিন্ন অংশ ডেটাবেসের টেবিলের কলামের নামের সাথে মেলানো হয়।
Spring Data JPA-তে কাস্টম কুয়েরি তৈরি করতে method name এবং keywords ব্যবহার করা হয়। মেথড নামের মধ্যে কীওয়ার্ড এবং প্রপার্টি নাম ঠিকভাবে ব্যবহার করলে JPA সঠিক কুয়েরি তৈরি করতে পারে।
findBy কীওয়ার্ডের সাহায্যে Spring Data JPA একটি কুয়েরি তৈরি করবে যা নির্দিষ্ট প্রপার্টির মান অনুসারে ডেটা খুঁজবে।
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
// findBy + property name
List<Employee> findByPosition(String position);
}
এখানে, findByPosition
মেথডটি Employee
টেবিলের position
কলাম অনুযায়ী সকল Employee
রেকর্ড খুঁজে বের করবে।
একাধিক প্রপার্টি দিয়ে কুয়েরি তৈরি করার জন্য, মেথডের নামের মধ্যে And
ব্যবহার করা হয়।
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
// findBy + property1 + And + property2
List<Employee> findByNameAndPosition(String name, String position);
}
এখানে, findByNameAndPosition
মেথডটি name
এবং position
কলাম দুটোকে একসাথে ব্যবহার করে ডেটা রিটার্ন করবে।
যদি OR শর্ত ব্যবহার করতে চান, তবে Or
কীওয়ার্ড ব্যবহার করা যায়।
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
// findBy + property1 + Or + property2
List<Employee> findByNameOrPosition(String name, String position);
}
এখানে, findByNameOrPosition
মেথডটি name
অথবা position
কলাম অনুযায়ী ডেটা রিটার্ন করবে।
Spring Data JPA-তে findBy মেথডের মাধ্যমে সর্টিংও করা যায়। Sort
ক্লাস ব্যবহার করে ডেটা অর্ডার করা যায়।
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
// findBy + property + Order By (sorting)
List<Employee> findByPositionOrderByNameAsc(String position);
}
এখানে, findByPositionOrderByNameAsc
মেথডটি position
কলামের ভিত্তিতে ডেটা খুঁজে বের করবে এবং name
কলাম অনুযায়ী Ascending (অর্থাৎ A-Z) অর্ডারে সাজানো থাকবে।
countBy কীওয়ার্ড ব্যবহার করে আপনি নির্দিষ্ট শর্তে রেকর্ডের সংখ্যা বের করতে পারেন।
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
// countBy + property
long countByPosition(String position);
}
এখানে, countByPosition
মেথডটি position
কলামের ভিত্তিতে Employee
টেবিলের রেকর্ডের সংখ্যা গণনা করবে।
existsBy কীওয়ার্ডটি ব্যবহার করে আপনি ডেটাবেসে কোনো রেকর্ডের অস্তিত্ব পরীক্ষা করতে পারেন।
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
// existsBy + property
boolean existsByName(String name);
}
এখানে, existsByName
মেথডটি name
কলামের ভিত্তিতে Employee
টেবিলের কোনো রেকর্ডের অস্তিত্ব পরীক্ষা করবে।
deleteBy কীওয়ার্ডটি দিয়ে আপনি একটি নির্দিষ্ট প্রপার্টির ভিত্তিতে ডেটা মুছে ফেলতে পারেন।
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
// deleteBy + property
void deleteByPosition(String position);
}
এখানে, deleteByPosition
মেথডটি position
কলামের ভিত্তিতে সকল Employee
রেকর্ড মুছে ফেলবে।
Spring Data JPA-তে Method Naming Convention ব্যবহার করে কাস্টম কুয়েরি তৈরি করা খুবই সহজ এবং কার্যকরী। ডেটাবেসের ডেটা খোঁজা, গোনা, মুছে ফেলা, এবং অস্তিত্ব যাচাই করার জন্য এই পদ্ধতি ব্যবহৃত হয়, যেখানে মেথড নামের ভিত্তিতে Spring Data JPA কুয়েরি তৈরি করে। এটি ডেভেলপারদের জন্য একটি সুবিধাজনক এবং কোডের পরিমাণ কমানোর উপায়।
স্প্রিং ডেটা জেপিএ @Query অ্যানোটেশন ব্যবহার করে কাস্টম কোয়েরি তৈরি করা যায়। এই অ্যানোটেশনটি ব্যবহার করে আপনি JPQL (Java Persistence Query Language) অথবা SQL কোয়েরি সরাসরি মেথডে লিখতে পারেন। স্প্রিং ডেটা জেপিএ আপনাকে Custom Query লেখার সুযোগ দেয়, যাতে আপনি আরও জটিল বা নির্দিষ্ট ডেটাবেস অপারেশন করতে পারেন যেগুলি স্প্রিং রেপোজিটরি থেকে সরাসরি পরিচালিত হয়।
@Query
অ্যানোটেশনটি আপনার JPA Repository ইন্টারফেসের মধ্যে ব্যবহার করা হয় এবং এতে কোয়েরি লেখা হয় যা JPQL
বা SQL
হিসেবে এক্সিকিউট হতে পারে। এটি এক্সপ্রেশন প্যারামিটারগুলির সাহায্যে আরও ডাইনামিকভাবে ব্যবহার করা যেতে পারে।
ধরা যাক, আমরা একটি Employee
ক্লাস ব্যবহার করছি যা আমাদের ডেটাবেসের employee
টেবিলের প্রতিনিধিত্ব করে।
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Employee {
@Id
private Long id;
private String name;
private String department;
private double salary;
// Getters and Setters
}
এখানে, Employee
ক্লাসের মধ্যে id
, name
, department
, এবং salary
ফিল্ড রয়েছে।
স্প্রিং ডেটা জেপিএ JpaRepository অথবা CrudRepository ইন্টারফেসের মাধ্যমে ডেটাবেস অ্যাক্সেস পরিচালনা করা যায়। কাস্টম কোয়েরি লেখার জন্য, @Query
অ্যানোটেশন ব্যবহার করা হয়।
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
// Custom JPQL Query using @Query
@Query("SELECT e FROM Employee e WHERE e.department = ?1")
List<Employee> findEmployeesByDepartment(String department);
// Custom SQL Query using @Query
@Query(value = "SELECT * FROM employee WHERE salary > ?1", nativeQuery = true)
List<Employee> findEmployeesWithSalaryGreaterThan(double salary);
// Custom JPQL Query with named parameter
@Query("SELECT e FROM Employee e WHERE e.name = :name")
List<Employee> findEmployeeByName(String name);
}
Employee
টেবিল থেকে নির্দিষ্ট department এর সমস্ত কর্মচারীকে খুঁজে বের করা হচ্ছে।?1
প্যারামিটারটি department
নামে আর্গুমেন্ট গ্রহণ করে।nativeQuery = true
ব্যবহার করা হয় এবং এটি সরাসরি ডেটাবেসের টেবিল employee
থেকে salary
এর ভিত্তিতে রেকর্ড নির্বাচন করে।name
প্যারামিটারকে নামের ভিত্তিতে কর্মচারীদের খুঁজে বের করা হচ্ছে। :name
নামের সঙ্গে যুক্ত একটি named parameter ব্যবহার করা হয়েছে।স্প্রিং সার্ভিস ক্লাসের মধ্যে Repository ইনজেক্ট করে আপনি ডেটাবেসের উপর কাস্টম কোয়েরি প্রয়োগ করতে পারেন।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class EmployeeService {
@Autowired
private EmployeeRepository employeeRepository;
public List<Employee> getEmployeesByDepartment(String department) {
return employeeRepository.findEmployeesByDepartment(department);
}
public List<Employee> getEmployeesWithSalaryGreaterThan(double salary) {
return employeeRepository.findEmployeesWithSalaryGreaterThan(salary);
}
public List<Employee> getEmployeeByName(String name) {
return employeeRepository.findEmployeeByName(name);
}
}
এখানে, EmployeeService ক্লাসে EmployeeRepository
ইনজেক্ট করা হয়েছে এবং স্প্রিং ডেটা জেপিএ @Query
অ্যানোটেশন ব্যবহার করে কাস্টম কোয়েরি মেথড কল করা হয়েছে।
স্প্রিং MVC ব্যবহার করে ডেটা ফেচ করা এবং ক্লায়েন্টের কাছে পাঠানোর জন্য একটি Controller ক্লাস তৈরি করা হয়।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class EmployeeController {
@Autowired
private EmployeeService employeeService;
@GetMapping("/employees/department/{department}")
public List<Employee> getEmployeesByDepartment(@PathVariable String department) {
return employeeService.getEmployeesByDepartment(department);
}
@GetMapping("/employees/salary/{salary}")
public List<Employee> getEmployeesWithSalaryGreaterThan(@PathVariable double salary) {
return employeeService.getEmployeesWithSalaryGreaterThan(salary);
}
@GetMapping("/employees/name/{name}")
public List<Employee> getEmployeeByName(@PathVariable String name) {
return employeeService.getEmployeeByName(name);
}
}
এখানে, EmployeeController ক্লাসের মধ্যে EmployeeService
ব্যবহার করে ডেটা রিট্রিভ করা হয়েছে এবং প্রতিটি রুটে কাস্টম কোয়েরি মেথড কল করা হয়েছে।
@Query
অ্যানোটেশন ব্যবহারের মাধ্যমে স্প্রিং ডেটা জেপিএতে খুব সহজে কাস্টম কোয়েরি লেখা যায়, যা সাধারণ JPA বা SQL কোয়েরি হয়।স্প্রিং ডেটা জেপিএ @Query অ্যানোটেশন ব্যবহার করে কাস্টম কোয়েরি লেখা খুবই সহজ এবং কার্যকরী। এটি স্প্রিং ডেভেলপারদের JPA বা SQL কোয়েরি ব্যবহার করে ডেটাবেসের উপর সুনির্দিষ্ট অপারেশন পরিচালনা করতে সহায়ক। এছাড়াও, কাস্টম কোয়েরি লেখার মাধ্যমে আরো জটিল বা নির্দিষ্ট প্রয়োজনীয়তা পূরণ করা সম্ভব হয়। @Query অ্যানোটেশন স্প্রিং অ্যাপ্লিকেশনকে আরও শক্তিশালী এবং নমনীয় করে তোলে।
Spring Data JPA একটি শক্তিশালী টুল যা ডেটাবেসে Custom Queries তৈরি করতে এবং কার্যকরভাবে ডেটা ম্যানিপুলেট করতে সাহায্য করে। আপনি JPQL (Java Persistence Query Language) বা native SQL queries ব্যবহার করে Spring Data JPA রেপোজিটরির মাধ্যমে কাস্টম কুয়েরি তৈরি করতে পারেন। এটি Repository ইন্টারফেসের মধ্যে কাস্টম মেথড তৈরি করে করতে হয়।
Spring Data JPA-তে কাস্টম কুয়েরি তৈরি করার জন্য দুইটি প্রধান উপায় রয়েছে:
নিচে এই দুটি পদ্ধতির উদাহরণ সহ আলোচনা করা হয়েছে।
Spring Data JPA-তে @Query অ্যানোটেশন ব্যবহার করে কাস্টম JPQL বা native SQL queries লিখতে পারেন। JPQL হল JPA-এর জন্য তৈরি করা একটি কুয়েরি ভাষা, যা ডেটাবেসের টেবিলের পরিবর্তে Entity ক্লাসে কাজ করে।
ধরা যাক, আমাদের একটি Product
Entity রয়েছে এবং আমরা Product
নামের একটি কাস্টম কুয়েরি তৈরি করতে চাই যা price
এর ওপর ভিত্তি করে পণ্যগুলিকে ফিল্টার করবে।
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Product {
@Id
private Long id;
private String name;
private Double price;
// Getters and Setters
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 getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
}
Spring Data JPA-তে @Query অ্যানোটেশন ব্যবহার করে কাস্টম JPQL কুয়েরি তৈরি করা হয়েছে:
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
// Custom JPQL Query using @Query annotation
@Query("SELECT p FROM Product p WHERE p.price > :price")
List<Product> findProductsByPriceGreaterThan(@Param("price") Double price);
}
এই কুয়েরিতে, আমরা Product
টেবিল থেকে সেই সব পণ্য খুঁজে বের করছি, যেগুলোর মূল্য নির্দিষ্ট price
এর চেয়ে বেশি।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.List;
@SpringBootApplication
public class SpringBootJpaApplication implements CommandLineRunner {
@Autowired
private ProductRepository productRepository;
public static void main(String[] args) {
SpringApplication.run(SpringBootJpaApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
List<Product> products = productRepository.findProductsByPriceGreaterThan(100.0);
products.forEach(product -> System.out.println("Product: " + product.getName() + " Price: " + product.getPrice()));
}
}
এই উদাহরণে, আমরা price
100 এর বেশি এমন পণ্যগুলো বের করেছি। @Query
অ্যানোটেশন ব্যবহার করে কাস্টম JPQL কুয়েরি তৈরি করা হয়েছে।
Spring Data JPA-তে native SQL queries ব্যবহার করতে @Query অ্যানোটেশনকে nativeQuery = true
দিয়ে সেট করা হয়। এতে আমরা সরাসরি ডেটাবেসের টেবিলের উপর কাজ করতে পারি, যা JPQL-এর তুলনায় আরও ফ্লেক্সিবল হতে পারে।
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
// Custom Native SQL Query using @Query annotation
@Query(value = "SELECT * FROM product WHERE price > ?1", nativeQuery = true)
List<Product> findProductsByPriceGreaterThanNative(Double price);
}
এখানে, @Query
অ্যানোটেশনের মধ্যে nativeQuery = true সেট করা হয়েছে, যার মাধ্যমে আমরা সরাসরি SQL কুয়েরি লিখতে পারি।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.List;
@SpringBootApplication
public class SpringBootJpaApplication implements CommandLineRunner {
@Autowired
private ProductRepository productRepository;
public static void main(String[] args) {
SpringApplication.run(SpringBootJpaApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
List<Product> products = productRepository.findProductsByPriceGreaterThanNative(100.0);
products.forEach(product -> System.out.println("Product: " + product.getName() + " Price: " + product.getPrice()));
}
}
এই উদাহরণে, আমরা native SQL query ব্যবহার করে একই ফলাফল অর্জন করেছি।
Spring Data JPA আরও একটি বিকল্প প্রদান করে, যেখানে আমরা Named Queries ব্যবহার করে কাস্টম কুয়েরি তৈরি করতে পারি। Named Queries ব্যবহার করার জন্য আপনাকে @Query
অ্যানোটেশন ব্যবহারের পরিবর্তে @NamedQuery
ব্যবহার করতে হবে।
@Entity
@NamedQueries({
@NamedQuery(name = "Product.findByPrice", query = "SELECT p FROM Product p WHERE p.price > :price")
})
public class Product {
@Id
private Long id;
private String name;
private Double price;
// Getters and Setters
}
এবং রেপোজিটরিতে কাস্টম মেথড:
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
// Using NamedQuery
List<Product> findByPriceGreaterThan(@Param("price") Double price);
}
এখানে, NamedQuery
ব্যবহারের মাধ্যমে findByPriceGreaterThan
মেথডটি Product
Entity ক্লাসের মধ্যে সংজ্ঞায়িত কুয়েরির মাধ্যমে কার্যকর হবে।
Spring Data JPA তে কাস্টম কুয়েরি তৈরি করা একটি শক্তিশালী এবং নমনীয় পদ্ধতি যা JPQL, native SQL, এবং Named Queries এর মাধ্যমে করা যায়। এর মাধ্যমে আপনি Spring Repository ইন্টারফেসের মধ্যে কাস্টম ডেটাবেস অপারেশন এবং কুয়েরি কার্যকরীভাবে পরিচালনা করতে পারেন। কাস্টম কুয়েরি ব্যবহার করলে অ্যাপ্লিকেশনের কার্যকারিতা এবং স্কেলেবিলিটি বৃদ্ধি পায় এবং বিশেষ প্রয়োজনে ডেটাবেসের গভীর কাস্টমাইজেশন সম্ভব হয়।
Read more