Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Spring Boot JPA:Übergeben mehrerer Werte für denselben Parameter (JPQL)

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%")))