क्योंकि @Query
JPQL का उपयोग करके संकलन समय पर तय करने की आवश्यकता है या यहां तक कि मूल क्वेरी इस तरह की चीजों को विशेष रूप से सुरक्षित तरीके से लागू करने के लिए कठिन बना देगी।
इसलिए मुझे एहसास हुआ कि आप JPQL समाधान के बाद हैं लेकिन यह सीखने और Specification
का लाभ उठाने का एक शानदार अवसर है। इंटरफ़ेस और जेपीए का CriteriaQuery. ठीक इसी के लिए है।
निम्नलिखित भंडार पर एक नज़र डालें:
public interface Table1Repository // to use specifications in queries
extends JpaRepository<Table1, Long>, JpaSpecificationExecutor<Table1> {
@SuppressWarnings("serial")
public static Specification<Table1> multiLikeColumn1(List<String> likePatterns) {
return new Specification<Table1>() {
@Override
public Predicate toPredicate(Root<Table1> root, CriteriaQuery<?> query,
CriteriaBuilder criteriaBuilder) {
Path<String> column1 = root.get("column1");
// create a Predicate for each "column1 like 'xy%az%' you need
List<Predicate> predicates = likePatterns.stream()
.map(likePattern -> criteriaBuilder.like(column1, likePattern))
.collect(Collectors.toList());
// then "concatenate" list of likes with "OR"
return criteriaBuilder.or(predicates.toArray(new Predicate[]{}));
}
};
}
}
यह थोड़ा जटिल लग सकता है लेकिन वास्तव में ऐसा नहीं है जब आप इससे परिचित होते हैं। उपयोग सरल है, जैसे:
@Resource
private Table1Repository repo;
repo.findAll(Table1Repository.multiLikeColumn1(Arrays.asList("%X%","%Z%")))