Omdat @Query
moet worden opgelost tijdens het compileren met behulp van JPQL of zelfs een native query maakt dit soort dingen moeilijk te implementeren, vooral op een typeveilige manier.
Dus ik realiseer me dat je op zoek bent naar een JPQL-oplossing, maar dit is een geweldige kans om te leren en te profiteren van Specification
interface en JPA's CriteriaQuery. Dit is precies waar het voor is.
Bekijk de volgende repository:
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[]{}));
}
};
}
}
Het ziet er misschien een beetje ingewikkeld uit, maar dat is het niet als je er vertrouwd mee raakt. Het gebruik is eenvoudig, zoals:
@Resource
private Table1Repository repo;
repo.findAll(Table1Repository.multiLikeColumn1(Arrays.asList("%X%","%Z%")))