SpEL এর মাধ্যমে ডায়নামিক ডেটা ফিল্টারিং
SpEL (Spring Expression Language) হল একটি শক্তিশালী ভাষা যা স্প্রিং ফ্রেমওয়ার্কের মধ্যে ডাইনামিক এক্সপ্রেশন রেজলভ করতে ব্যবহৃত হয়। ডায়নামিক ডেটা ফিল্টারিং এমন একটি প্রক্রিয়া যা ব্যবহারকারীর ইনপুট বা অন্যান্য ডাইনামিক কন্ডিশনের ভিত্তিতে ডেটা সংগ্রহ করে। SpEL ব্যবহার করে, Spring Data JPA বা Hibernate-এর মাধ্যমে ডেটা ফিল্টার করা সম্ভব হয়, বিশেষ করে Query Methods-এ যেখানে ডায়নামিক কন্ডিশন অ্যাপ্লাই করা হয়।
স্প্রিং ডেটা জেপিএ (Spring Data JPA) বা স্প্রিং ডেটা রেপোজিটরির Query Methods দিয়ে আপনি সরাসরি ডেটাবেস থেকে ডেটা ফিল্টার করতে পারেন। SpEL ব্যবহৃত হয় কাস্টম কুয়েরি তৈরির জন্য, যেখানে বিভিন্ন কন্ডিশন ডাইনামিকভাবে পরিবর্তিত হতে পারে।
SpEL এবং ডায়নামিক ডেটা ফিল্টারিং
Spring Data JPA বা Hibernate ব্যবহার করে ডায়নামিক ফিল্টারিং করার জন্য, আপনি Specification API, @Query এনোটেশন বা Querydsl ব্যবহার করতে পারেন। SpEL ব্যবহার করা হয় যেখানে কন্ডিশন ডাইনামিকভাবে তৈরি করা হয়, যেমন @Query অথবা Specification এ কন্ডিশন ইনপুটের ভিত্তিতে তৈরি করা হয়।
উদাহরণ ১: @Query এনোটেশন এবং SpEL দিয়ে ডায়নামিক কুয়েরি
ধরা যাক, একটি User ক্লাস রয়েছে এবং আমরা ডায়নামিক কুয়েরি দিয়ে ব্যবহারকারীদের নাম বা বয়সের ভিত্তিতে ফিল্টার করতে চাই। এখানে SpEL ব্যবহার করা হবে কুয়েরি তৈরির জন্য।
Step 1: User ক্লাস তৈরি করা
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int age;
// Constructor, Getters and Setters
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
Step 2: UserRepository তৈরি করা
public interface UserRepository extends JpaRepository<User, Long> {
// SpEL ব্যবহার করে ডায়নামিক কুয়েরি
@Query("SELECT u FROM User u WHERE " +
"(#name IS NULL OR u.name = :name) AND " +
"(#age IS NULL OR u.age = :age)")
List<User> findUsersByDynamicCriteria(@Param("name") String name, @Param("age") Integer age);
}
Step 3: Java কোডে ডায়নামিক কুয়েরি ব্যবহার
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/users")
public List<User> getUsersByFilter(@RequestParam(required = false) String name,
@RequestParam(required = false) Integer age) {
return userRepository.findUsersByDynamicCriteria(name, age);
}
}
ব্যাখ্যা:
- SpEL কুয়েরি:
#name IS NULL OR u.name = :nameএবং#age IS NULL OR u.age = :ageঅংশগুলো SpEL দিয়ে ডায়নামিক কন্ডিশন অ্যাপ্লাই করছে। যদিnameবাagenull থাকে, তখন সেই ফিল্টারটি অবহেলিত হয় এবং অন্যান্য ফিল্টারটি কার্যকর হয়। - ডায়নামিক কন্ডিশন: যখন
nameবাageপ্যারামিটার প্রদান করা হয় না, তখন সেই কন্ডিশনটি উপেক্ষা করা হয় এবং কুয়েরি সমস্ত ব্যবহারকারী ফেরত দেয়।
উদাহরণ ২: Specification API দিয়ে SpEL ব্যবহার
Spring Data JPA-তে Specification API ব্যবহার করে আরও জটিল ডায়নামিক ফিল্টারিং করা সম্ভব। SpEL এক্সপ্রেশন ব্যবহার করে আপনি ডাইনামিক ফিল্টার কন্ডিশন তৈরি করতে পারেন।
Step 1: UserSpecification তৈরি করা
import org.springframework.data.jpa.domain.Specification;
public class UserSpecification {
public static Specification<User> filterByNameAndAge(String name, Integer age) {
return (root, query, criteriaBuilder) -> {
Predicate namePredicate = criteriaBuilder.equal(root.get("name"), name);
Predicate agePredicate = criteriaBuilder.equal(root.get("age"), age);
// SpEL দিয়ে ডায়নামিক কন্ডিশন তৈরি করা
if (name != null && age != null) {
return criteriaBuilder.and(namePredicate, agePredicate);
} else if (name != null) {
return namePredicate;
} else if (age != null) {
return agePredicate;
}
return criteriaBuilder.conjunction();
};
}
}
Step 2: UserRepository তে Specification ব্যবহার করা
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
}
Step 3: Service বা Controller ক্লাসে Specification ব্যবহার করা
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class UserController {
@Autowired
private UserRepository userRepository;
@GetMapping("/users")
public List<User> getUsersByFilter(@RequestParam(required = false) String name,
@RequestParam(required = false) Integer age) {
Specification<User> spec = UserSpecification.filterByNameAndAge(name, age);
return userRepository.findAll(spec);
}
}
ব্যাখ্যা:
- Specification API ব্যবহার করে আমরা SpEL এর মাধ্যমে ডায়নামিক কন্ডিশন তৈরি করেছি।
criteriaBuilder.equal(root.get("name"), name)এবংcriteriaBuilder.equal(root.get("age"), age)SpEL এক্সপ্রেশন দ্বারা কন্ডিশন তৈরি করা হয়েছে।- এই পদ্ধতিতে ডায়নামিক ফিল্টারিং খুবই শক্তিশালী এবং এটি জটিল কুয়েরি তৈরি করতে সহায়তা করে।
সারাংশ
SpEL (Spring Expression Language) ব্যবহার করে Spring Data JPA বা Hibernate-এর মাধ্যমে ডায়নামিক ডেটা ফিল্টারিং করা যায়। @Query এনোটেশন এবং Specification API এর মাধ্যমে ডায়নামিক কুয়েরি তৈরি করা সম্ভব, যেখানে SpEL কন্ডিশনগুলো ডাইনামিকভাবে অ্যাপ্লাই করা হয়। SpEL এর মাধ্যমে আপনি সহজেই কন্ডিশনগুলি ফিল্টার করতে পারেন, যেমন যদি একটি প্যারামিটার null থাকে তবে সেটি উপেক্ষা করা হবে এবং অন্য কন্ডিশন কার্যকর হবে।