Karena @Query
perlu diperbaiki pada waktu kompilasi menggunakan JPQL atau bahkan kueri asli akan membuat hal-hal semacam ini sulit untuk diterapkan terutama dengan cara yang aman.
Jadi saya menyadari Anda mencari solusi JPQL tetapi ini adalah kesempatan luar biasa untuk belajar dan memanfaatkan Specification
antarmuka dan KriteriaQuery JPA. Ini persis untuknya.
Lihatlah repositori berikut:
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[]{}));
}
};
}
}
Ini mungkin terlihat agak rumit tetapi sebenarnya tidak ketika Anda terbiasa dengannya. Penggunaannya sederhana, seperti:
@Resource
private Table1Repository repo;
repo.findAll(Table1Repository.multiLikeColumn1(Arrays.asList("%X%","%Z%")))