Bởi vì @Query
cần được sửa tại thời điểm biên dịch bằng cách sử dụng JPQL hoặc thậm chí truy vấn gốc sẽ khiến loại thứ này khó triển khai, đặc biệt là theo cách an toàn.
Vì vậy, tôi nhận ra bạn đang theo đuổi giải pháp JPQL nhưng đây là một cơ hội tuyệt vời để tìm hiểu và tận dụng Specification
giao diện và CriteriaQuery của JPA. Đây chính xác là nó dành cho.
Hãy xem kho lưu trữ sau:
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[]{}));
}
};
}
}
Nhìn thì có vẻ hơi phức tạp nhưng thực sự thì không khi bạn làm quen với nó. Cách sử dụng rất đơn giản, như:
@Resource
private Table1Repository repo;
repo.findAll(Table1Repository.multiLikeColumn1(Arrays.asList("%X%","%Z%")))