Mysql
 sql >> Database >  >> RDS >> Mysql

Spring Boot JPA:passaggio di più valori per lo stesso parametro (JPQL)

Perché @Query deve essere corretto in fase di compilazione utilizzando JPQL o anche una query nativa renderà questo tipo di cose difficili da implementare, specialmente in un modo sicuro per i tipi.

Quindi mi rendo conto che stai cercando una soluzione JPQL, ma questa è una fantastica opportunità per imparare e sfruttare le Specification interfaccia e CriteriaQuery di JPA. Questo è esattamente ciò che serve.

Dai un'occhiata al seguente 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[]{}));
            }
        };
    }

}

Potrebbe sembrare un po' complesso, ma in realtà non lo è quando ci si familiarizza. L'utilizzo è semplice, come:

@Resource
private Table1Repository repo;
repo.findAll(Table1Repository.multiLikeColumn1(Arrays.asList("%X%","%Z%")))