Fordi @Query
skal rettes på kompileringstidspunktet ved hjælp af JPQL eller endda native forespørgsler vil gøre denne slags ting svære at implementere, især på en typesikker måde.
Så jeg er klar over, at du er ude efter JPQL-løsning, men dette er en fantastisk mulighed for at lære og drage fordel af Specification
interface og JPA's CriteriaQuery. Det er præcis, det er til.
Tag et kig på følgende lager:
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[]{}));
}
};
}
}
Det ser måske lidt komplekst ud, men det er det faktisk ikke, når du bliver fortroligt med det. Brugen er enkel, f.eks.:
@Resource
private Table1Repository repo;
repo.findAll(Table1Repository.multiLikeColumn1(Arrays.asList("%X%","%Z%")))