@Query
コンパイル時にJPQLを使用して修正する必要があります。そうしないと、ネイティブクエリでさえ、この種のことを特にタイプセーフな方法で実装するのが難しくなります。
ですから、あなたはJPQLソリューションを求めていると思いますが、これはSpecification
を学び、活用する絶好の機会です。 インターフェイスとJPAのCriteriaQuery。これはまさにそのためです。
次のリポジトリを見てください:
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[]{}));
}
};
}
}
少し複雑に見えるかもしれませんが、実際には慣れていない場合はそうではありません。使い方は次のように簡単です:
@Resource
private Table1Repository repo;
repo.findAll(Table1Repository.multiLikeColumn1(Arrays.asList("%X%","%Z%")))