Protože @Query
musí být opraveny v době kompilace pomocí JPQL nebo dokonce nativní dotaz ztíží implementaci tohoto druhu věcí, zejména typově bezpečným způsobem.
Takže si uvědomuji, že hledáte řešení JPQL, ale toto je skvělá příležitost naučit se a využít výhod Specification
rozhraní a CriteriaQuery JPA. To je přesně pro to.
Podívejte se na následující úložiště:
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[]{}));
}
};
}
}
Může to vypadat trochu složitě, ale ve skutečnosti tomu tak není, když se s tím seznámíte. Použití je jednoduché, jako:
@Resource
private Table1Repository repo;
repo.findAll(Table1Repository.multiLikeColumn1(Arrays.asList("%X%","%Z%")))