Denn @Query
muss zur Kompilierzeit mit JPQL behoben werden, oder selbst native Abfragen machen es schwierig, solche Dinge zu implementieren, insbesondere auf typsichere Weise.
Mir ist also klar, dass Sie nach einer JPQL-Lösung suchen, aber dies ist eine großartige Gelegenheit, Specification
zu lernen und davon zu profitieren Schnittstelle und CriteriaQuery von JPA. Genau dafür ist es da.
Werfen Sie einen Blick auf das folgende 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[]{}));
}
};
}
}
Es mag ein bisschen komplex aussehen, ist es aber eigentlich nicht, wenn Sie sich damit vertraut machen. Die Verwendung ist einfach, wie:
@Resource
private Table1Repository repo;
repo.findAll(Table1Repository.multiLikeColumn1(Arrays.asList("%X%","%Z%")))