Query Methods এবং Custom Queries

Java Technologies - স্প্রিং বুট জেপিএ (Spring Boot JPA)
109
109

Spring Boot JPA কী?

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 ব্যবহার করে ডেটাবেসের সাথে আরও জটিল অপারেশন সম্পাদন করা সম্ভব।


1. Query Methods

Spring Data JPA তে Query Methods ব্যবহার করে আপনি সহজভাবে বিভিন্ন ডেটাবেস প্রশ্ন (queries) তৈরি করতে পারেন, যেখানে Spring ডেটাবেস কুয়েরি সৃষ্টির জন্য মেথড নাম ব্যবহার করে।

1.1. Query Method এর মৌলিক গঠন

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 মেথডটি ইমেইল দিয়ে ব্যবহারকারী খুঁজে বের করবে।

1.2. Query Methods এর Naming Conventions

Spring Data JPA-তে, আপনি query method names এর মাধ্যমে JPQL কুয়েরি তৈরি করতে পারেন। এর মাধ্যমে সহজভাবে কুয়েরি তৈরির জন্য কিছু কনভেনশন রয়েছে:

  • findBy: অনুসন্ধান করার জন্য
  • countBy: গণনা করার জন্য
  • existsBy: কোনো ডেটা রয়েছে কি না পরীক্ষা করার জন্য
  • deleteBy: ডিলিট করার জন্য

উদাহরণ:

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 কুয়েরিতে রূপান্তরিত হবে।


2. Custom Queries

যখন Query Methods যথেষ্ট না হয় বা আপনি জটিল কুয়েরি করতে চান, তখন Custom Queries ব্যবহার করা হয়। Custom Queries তৈরি করার জন্য, আপনি @Query অ্যানোটেশন ব্যবহার করতে পারেন, যা JPQL বা SQL কুয়েরি লেখা সহজ করে।

2.1. @Query অ্যানোটেশন ব্যবহার করে Custom Queries

Spring Data JPA তে @Query অ্যানোটেশন ব্যবহার করে আপনি কাস্টম কুয়েরি তৈরি করতে পারেন। এখানে আমরা JPQL (Java Persistence Query Language) বা native SQL কুয়েরি ব্যবহার করতে পারি।

উদাহরণ: JPQL ব্যবহার করে Custom Query

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 এর ভিত্তিতে ব্যবহারকারী খুঁজে বের করবে।

2.2. Native SQL ব্যবহার করে Custom Query

Spring Data JPA তে, আপনি যদি native SQL ব্যবহার করতে চান, তবে nativeQuery = true প্যারামিটারটি ব্যবহার করতে হবে।

উদাহরণ: Native SQL ব্যবহার করে Custom Query

@Query(value = "SELECT * FROM user WHERE email = :email", nativeQuery = true)
User findUserByEmail(@Param("email") String email);

এখানে, nativeQuery = true ব্যবহার করে native SQL কুয়েরি ব্যবহার করা হয়েছে, যা ডেটাবেসের প্রকৃত টেবিল থেকে ডেটা ফেচ করবে।

2.3. Paging এবং Sorting

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 অনুসারে ব্যবহারকারী খুঁজে বের করবে।


3. Criteria API ব্যবহার করে Custom Queries

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 আপনাকে জটিল কুয়েরি তৈরি এবং কার্যকরীভাবে ডেটাবেস ম্যানেজমেন্ট করার সুযোগ দেয়।


Content added By

Query Methods কি এবং কিভাবে কাজ করে?

94
94

Query Methods কী?

Query Methods হল Spring Data JPA এর একটি বৈশিষ্ট্য যা আপনাকে ডেটাবেস থেকে ডেটা অনুসন্ধান করতে সহজ এবং টেমপ্লেট পদ্ধতিতে কাস্টম কুয়েরি তৈরি করতে সহায়তা করে। Spring Data JPA স্বয়ংক্রিয়ভাবে Query Methods তৈরি করে, যেগুলি মূলত method names এর ভিত্তিতে ডাইনামিক SQL কুয়েরি তৈরি করে। এগুলির মাধ্যমে, আপনি Java method names ব্যবহার করে ডেটাবেস থেকে ডেটা রিট্রিভ বা ফিল্টার করতে পারেন, এবং এর জন্য কোন নির্দিষ্ট SQL কুয়েরি লেখার দরকার নেই।

স্প্রিং ডেটা জেপিএ (Spring Data JPA) এ Query Methods সাধারণত Repository ইন্টারফেসে ডিফাইন করা হয়, যেখানে মেথডের নামের ভিত্তিতে ডেটাবেস কুয়েরি তৈরি হয়। স্প্রিং এটি স্বয়ংক্রিয়ভাবে বিশ্লেষণ করে এবং উপযুক্ত SQL কুয়েরি তৈরি করে।


Query Methods কিভাবে কাজ করে?

Spring Data JPA-তে Query Methods তৈরি করার জন্য, JpaRepository বা CrudRepository এর মাধ্যমে একটি ইন্টারফেস তৈরি করতে হয়। এই ইন্টারফেসের মধ্যে আপনি ডেটা ফিল্টারিং, খোঁজা এবং ডেটাবেস অপারেশনগুলো সহজেই নির্ধারণ করতে পারেন।

Query Methods এর নাম অনুসারে স্প্রিং কন্টেইনার স্বয়ংক্রিয়ভাবে কুয়েরি তৈরি করে। উদাহরণস্বরূপ, findBy, findAllBy, deleteBy ইত্যাদি ব্যবহার করে ডেটাবেস অপারেশন করা যায়।


Spring Data JPA Query Methods এর উদাহরণ

ধরা যাক, আমাদের একটি User Entity ক্লাস রয়েছে এবং আমরা একটি UserRepository ইন্টারফেস তৈরি করব, যাতে বিভিন্ন ডেটাবেস অপারেশন করা যায়।

Step 1: 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;
    }
}

Step 2: 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 এর মাধ্যমে ব্যবহারকারীকে মুছে ফেলবে।

স্প্রিং ডেটা জেপিএ স্বয়ংক্রিয়ভাবে এই মেথডগুলির জন্য কুয়েরি তৈরি করে।


Step 3: Service ক্লাস তৈরি করা

ডেটাবেসের সাথে কাজ করার জন্য একটি 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);
    }
}

Step 4: Controller ক্লাস তৈরি করা

এখন আমরা একটি 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: ইমেইল দিয়ে ব্যবহারকারী মুছে ফেলার জন্য।

Step 5: Spring Boot Application চালানো

এখন @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);
    }
}

এটি স্প্রিং বুট অ্যাপ্লিকেশন শুরু করবে এবং ডেটাবেস সংযুক্ত করবে।


Step 6: অ্যাপ্লিকেশন চালানো

এখন আপনি আপনার Spring Boot অ্যাপ্লিকেশনটি চালু করতে পারেন এবং বিভিন্ন HTTP রিকোয়েস্টের মাধ্যমে ডেটা সঞ্চয়, অনুসন্ধান এবং মুছে ফেলতে পারবেন।

উদাহরণ:

  1. Add User:

    POST http://localhost:8080/users/add?name=JohnDoe&email=johndoe@example.com
    
  2. Find User by Name:

    GET http://localhost:8080/users/findByName?name=JohnDoe
    
  3. Find Users by Name Prefix:

    GET http://localhost:8080/users/findByNamePrefix?prefix=John
    
  4. 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 কুয়েরি তৈরি করে।


Content added By

Method Naming Convention অনুসারে Custom Query তৈরি করা

86
86

Spring Data JPA ডেটাবেস কুয়েরি তৈরি করার জন্য একটি শক্তিশালী এবং নমনীয় পদ্ধতি সরবরাহ করে যা Method Naming Convention ব্যবহার করে কাস্টম কুয়েরি তৈরি করতে সাহায্য করে। Spring Data JPA রেপোজিটরি ইন্টারফেসের মেথডের নাম অনুসারে কুয়েরি তৈরি করে, যার মাধ্যমে SQL কুয়েরি লিখতে হয় না। Spring Data JPA স্বয়ংক্রিয়ভাবে মেথডের নামের উপর ভিত্তি করে ডেটাবেস কুয়েরি তৈরি করে।

Method Naming Convention-এর মূল ধারণা

Spring Data JPA মেথডের নামের ভিত্তিতে কুয়েরি তৈরি করার জন্য কিছু নিয়ম অনুসরণ করে। এই নিয়মের মধ্যে find, read, get, count, exists, delete এবং update এর মতো কীওয়ার্ড ব্যবহার করা হয়। মেথডের নামের বিভিন্ন অংশ ডেটাবেসের টেবিলের কলামের নামের সাথে মেলানো হয়।

মেথড নামের সাধারণ গঠন:

  1. findBy – নির্দিষ্ট প্রপার্টি অনুসারে ডেটা খুঁজতে।
  2. findAllBy – সমস্ত রেকর্ড খুঁজতে একটি নির্দিষ্ট প্রপার্টি অনুযায়ী।
  3. countBy – একটি নির্দিষ্ট প্রপার্টি অনুসারে রেকর্ডের সংখ্যা গোনার জন্য।
  4. existsBy – নির্দিষ্ট শর্ত অনুসারে রেকর্ডের অস্তিত্ব যাচাই করার জন্য।
  5. deleteBy – নির্দিষ্ট প্রপার্টি অনুসারে রেকর্ড মুছে ফেলতে।

Custom Query তৈরি করার জন্য Method Naming Convention

Spring Data JPA-তে কাস্টম কুয়েরি তৈরি করতে method name এবং keywords ব্যবহার করা হয়। মেথড নামের মধ্যে কীওয়ার্ড এবং প্রপার্টি নাম ঠিকভাবে ব্যবহার করলে JPA সঠিক কুয়েরি তৈরি করতে পারে।

১. findBy Keyword ব্যবহার করা

findBy কীওয়ার্ডের সাহায্যে Spring Data JPA একটি কুয়েরি তৈরি করবে যা নির্দিষ্ট প্রপার্টির মান অনুসারে ডেটা খুঁজবে।

উদাহরণ:

public interface EmployeeRepository extends JpaRepository<Employee, Long> {

    // findBy + property name
    List<Employee> findByPosition(String position);
}

এখানে, findByPosition মেথডটি Employee টেবিলের position কলাম অনুযায়ী সকল Employee রেকর্ড খুঁজে বের করবে।

২. findBy এবং Multiple Properties ব্যবহার করা

একাধিক প্রপার্টি দিয়ে কুয়েরি তৈরি করার জন্য, মেথডের নামের মধ্যে And ব্যবহার করা হয়।

public interface EmployeeRepository extends JpaRepository<Employee, Long> {

    // findBy + property1 + And + property2
    List<Employee> findByNameAndPosition(String name, String position);
}

এখানে, findByNameAndPosition মেথডটি name এবং position কলাম দুটোকে একসাথে ব্যবহার করে ডেটা রিটার্ন করবে।

৩. findBy এবং Multiple Properties with OR Condition

যদি OR শর্ত ব্যবহার করতে চান, তবে Or কীওয়ার্ড ব্যবহার করা যায়।

public interface EmployeeRepository extends JpaRepository<Employee, Long> {

    // findBy + property1 + Or + property2
    List<Employee> findByNameOrPosition(String name, String position);
}

এখানে, findByNameOrPosition মেথডটি name অথবা position কলাম অনুযায়ী ডেটা রিটার্ন করবে।

৪. findBy এবং Sorting

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 Keyword ব্যবহার করা

countBy কীওয়ার্ড ব্যবহার করে আপনি নির্দিষ্ট শর্তে রেকর্ডের সংখ্যা বের করতে পারেন।

public interface EmployeeRepository extends JpaRepository<Employee, Long> {

    // countBy + property
    long countByPosition(String position);
}

এখানে, countByPosition মেথডটি position কলামের ভিত্তিতে Employee টেবিলের রেকর্ডের সংখ্যা গণনা করবে।

৬. existsBy Keyword ব্যবহার করা

existsBy কীওয়ার্ডটি ব্যবহার করে আপনি ডেটাবেসে কোনো রেকর্ডের অস্তিত্ব পরীক্ষা করতে পারেন।

public interface EmployeeRepository extends JpaRepository<Employee, Long> {

    // existsBy + property
    boolean existsByName(String name);
}

এখানে, existsByName মেথডটি name কলামের ভিত্তিতে Employee টেবিলের কোনো রেকর্ডের অস্তিত্ব পরীক্ষা করবে।

৭. deleteBy Keyword ব্যবহার করা

deleteBy কীওয়ার্ডটি দিয়ে আপনি একটি নির্দিষ্ট প্রপার্টির ভিত্তিতে ডেটা মুছে ফেলতে পারেন।

public interface EmployeeRepository extends JpaRepository<Employee, Long> {

    // deleteBy + property
    void deleteByPosition(String position);
}

এখানে, deleteByPosition মেথডটি position কলামের ভিত্তিতে সকল Employee রেকর্ড মুছে ফেলবে।


Method Naming Convention এর সুবিধা

  1. No need for Custom Queries: Method Naming Convention ব্যবহার করে JPA-র স্বয়ংক্রিয়ভাবে কুয়েরি তৈরি করা যায়, ফলে কোডে কাস্টম SQL কুয়েরি লেখার প্রয়োজন পড়ে না।
  2. Readable and Understandable: মেথডের নামের মাধ্যমে কুয়েরি কি করবে তা স্পষ্ট হয়, যা কোডের রিডেবিলিটি উন্নত করে।
  3. Less Boilerplate Code: Spring Data JPA অটোমেটিকভাবে কুয়েরি তৈরি করে, ফলে ডেভেলপারকে কম কোড লিখতে হয়।
  4. Integration with Spring Features: এটি Spring Framework-এর অন্যান্য বৈশিষ্ট্যের সাথে খুব সহজে ইন্টিগ্রেট করা যায়, যেমন পেজিনেশন, সর্টিং, ট্রানজ্যাকশন ম্যানেজমেন্ট ইত্যাদি।

সারাংশ

Spring Data JPA-তে Method Naming Convention ব্যবহার করে কাস্টম কুয়েরি তৈরি করা খুবই সহজ এবং কার্যকরী। ডেটাবেসের ডেটা খোঁজা, গোনা, মুছে ফেলা, এবং অস্তিত্ব যাচাই করার জন্য এই পদ্ধতি ব্যবহৃত হয়, যেখানে মেথড নামের ভিত্তিতে Spring Data JPA কুয়েরি তৈরি করে। এটি ডেভেলপারদের জন্য একটি সুবিধাজনক এবং কোডের পরিমাণ কমানোর উপায়।

Content added By

@Query অ্যানোটেশন ব্যবহার করে Custom Query লেখা

95
95

স্প্রিং ডেটা জেপিএ @Query অ্যানোটেশন ব্যবহার করে কাস্টম কোয়েরি তৈরি করা যায়। এই অ্যানোটেশনটি ব্যবহার করে আপনি JPQL (Java Persistence Query Language) অথবা SQL কোয়েরি সরাসরি মেথডে লিখতে পারেন। স্প্রিং ডেটা জেপিএ আপনাকে Custom Query লেখার সুযোগ দেয়, যাতে আপনি আরও জটিল বা নির্দিষ্ট ডেটাবেস অপারেশন করতে পারেন যেগুলি স্প্রিং রেপোজিটরি থেকে সরাসরি পরিচালিত হয়।

@Query অ্যানোটেশনটি আপনার JPA Repository ইন্টারফেসের মধ্যে ব্যবহার করা হয় এবং এতে কোয়েরি লেখা হয় যা JPQL বা SQL হিসেবে এক্সিকিউট হতে পারে। এটি এক্সপ্রেশন প্যারামিটারগুলির সাহায্যে আরও ডাইনামিকভাবে ব্যবহার করা যেতে পারে।


@Query অ্যানোটেশন ব্যবহার করে Custom Query লেখার উদাহরণ

Step ১: Entity ক্লাস তৈরি করা

ধরা যাক, আমরা একটি 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 ফিল্ড রয়েছে।


Step ২: Custom Query এর জন্য Repository তৈরি করা

স্প্রিং ডেটা জেপিএ 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);
}

Explanation:

  1. findEmployeesByDepartment:
    • JPQL কোয়েরি ব্যবহার করে Employee টেবিল থেকে নির্দিষ্ট department এর সমস্ত কর্মচারীকে খুঁজে বের করা হচ্ছে।
    • ?1 প্যারামিটারটি department নামে আর্গুমেন্ট গ্রহণ করে।
  2. findEmployeesWithSalaryGreaterThan:
    • Native SQL কোয়েরি ব্যবহার করে, যেখানে nativeQuery = true ব্যবহার করা হয় এবং এটি সরাসরি ডেটাবেসের টেবিল employee থেকে salary এর ভিত্তিতে রেকর্ড নির্বাচন করে।
  3. findEmployeeByName:
    • JPQL কোয়েরি ব্যবহার করে, এখানে name প্যারামিটারকে নামের ভিত্তিতে কর্মচারীদের খুঁজে বের করা হচ্ছে। :name নামের সঙ্গে যুক্ত একটি named parameter ব্যবহার করা হয়েছে।

Step ৩: Service ক্লাস তৈরি করা

স্প্রিং সার্ভিস ক্লাসের মধ্যে 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 অ্যানোটেশন ব্যবহার করে কাস্টম কোয়েরি মেথড কল করা হয়েছে।


Step ৪: Controller ক্লাস তৈরি করা

স্প্রিং 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 অ্যানোটেশন ব্যবহারের সুবিধা

  1. কাস্টম কোয়েরি লেখা সহজ: @Query অ্যানোটেশন ব্যবহারের মাধ্যমে স্প্রিং ডেটা জেপিএতে খুব সহজে কাস্টম কোয়েরি লেখা যায়, যা সাধারণ JPA বা SQL কোয়েরি হয়।
  2. কাস্টমাইজযোগ্য কোয়েরি: একাধিক প্যারামিটার এবং শর্তাবলী নিয়ে জটিল কোয়েরি তৈরি করা যায়।
  3. প্রফেশনাল এবং কার্যকরী কোড: স্প্রিং ডেটা জেপিএ JPQL এবং Native SQL কোয়েরি সমর্থন করে, যা ডেটাবেসের নিকটবর্তী কার্যকরী সমাধান প্রদান করে।
  4. মেটাডাটা অ্যানোটেশন: স্প্রিং Named Parameters এবং Positional Parameters সমর্থন করে, যা কোডকে আরও ক্লিন এবং পরিষ্কার রাখে।

উপসংহার

স্প্রিং ডেটা জেপিএ @Query অ্যানোটেশন ব্যবহার করে কাস্টম কোয়েরি লেখা খুবই সহজ এবং কার্যকরী। এটি স্প্রিং ডেভেলপারদের JPA বা SQL কোয়েরি ব্যবহার করে ডেটাবেসের উপর সুনির্দিষ্ট অপারেশন পরিচালনা করতে সহায়ক। এছাড়াও, কাস্টম কোয়েরি লেখার মাধ্যমে আরো জটিল বা নির্দিষ্ট প্রয়োজনীয়তা পূরণ করা সম্ভব হয়। @Query অ্যানোটেশন স্প্রিং অ্যাপ্লিকেশনকে আরও শক্তিশালী এবং নমনীয় করে তোলে।


Content added By

উদাহরণ সহ Custom Queries তৈরি

132
132

Spring Data JPA একটি শক্তিশালী টুল যা ডেটাবেসে Custom Queries তৈরি করতে এবং কার্যকরভাবে ডেটা ম্যানিপুলেট করতে সাহায্য করে। আপনি JPQL (Java Persistence Query Language) বা native SQL queries ব্যবহার করে Spring Data JPA রেপোজিটরির মাধ্যমে কাস্টম কুয়েরি তৈরি করতে পারেন। এটি Repository ইন্টারফেসের মধ্যে কাস্টম মেথড তৈরি করে করতে হয়।

Spring Data JPA-তে কাস্টম কুয়েরি তৈরি করার জন্য দুইটি প্রধান উপায় রয়েছে:

  1. Query Annotation ব্যবহার করে।
  2. @Query অ্যানোটেশন ব্যবহার করে।

নিচে এই দুটি পদ্ধতির উদাহরণ সহ আলোচনা করা হয়েছে।


1. Query Annotation ব্যবহার করে Custom Queries

Spring Data JPA-তে @Query অ্যানোটেশন ব্যবহার করে কাস্টম JPQL বা native SQL queries লিখতে পারেন। JPQL হল JPA-এর জন্য তৈরি করা একটি কুয়েরি ভাষা, যা ডেটাবেসের টেবিলের পরিবর্তে Entity ক্লাসে কাজ করে।

উদাহরণ: JPQL কুয়েরি ব্যবহার করে Custom Query

ধরা যাক, আমাদের একটি Product Entity রয়েছে এবং আমরা Product নামের একটি কাস্টম কুয়েরি তৈরি করতে চাই যা price এর ওপর ভিত্তি করে পণ্যগুলিকে ফিল্টার করবে।

Step 1: Entity Class

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;
    }
}

Step 2: Custom Query Repository Interface

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 এর চেয়ে বেশি।

Step 3: Main Application Class

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 কুয়েরি তৈরি করা হয়েছে।


2. Native SQL Queries ব্যবহার করে Custom Query

Spring Data JPA-তে native SQL queries ব্যবহার করতে @Query অ্যানোটেশনকে nativeQuery = true দিয়ে সেট করা হয়। এতে আমরা সরাসরি ডেটাবেসের টেবিলের উপর কাজ করতে পারি, যা JPQL-এর তুলনায় আরও ফ্লেক্সিবল হতে পারে।

উদাহরণ: Native SQL কুয়েরি ব্যবহার করে Custom Query

@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 কুয়েরি লিখতে পারি।

Step 2: Main Application Class

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 ব্যবহার করে একই ফলাফল অর্জন করেছি।


3. Named Queries ব্যবহার করে Custom 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 ইন্টারফেসের মধ্যে কাস্টম ডেটাবেস অপারেশন এবং কুয়েরি কার্যকরীভাবে পরিচালনা করতে পারেন। কাস্টম কুয়েরি ব্যবহার করলে অ্যাপ্লিকেশনের কার্যকারিতা এবং স্কেলেবিলিটি বৃদ্ধি পায় এবং বিশেষ প্রয়োজনে ডেটাবেসের গভীর কাস্টমাইজেশন সম্ভব হয়।

Content added By
Promotion