Eftersom @Query
måste fixas vid kompilering med JPQL eller till och med inbyggd fråga kommer att göra den här typen av saker svåra att implementera, särskilt på ett typsäkert sätt.
Så jag inser att du är ute efter JPQL-lösning men det här är en fantastisk möjlighet att lära sig och dra nytta av Specification
gränssnitt och JPA:s CriteriaQuery. Det är precis det den är till för.
Ta en titt på följande arkiv:
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 kan se lite komplicerat ut men det är det faktiskt inte när du blir bekant med det. Användningen är enkel, som:
@Resource
private Table1Repository repo;
repo.findAll(Table1Repository.multiLikeColumn1(Arrays.asList("%X%","%Z%")))