Mysql
 sql >> Base de données >  >> RDS >> Mysql

Spring Boot JPA :transmission de plusieurs valeurs pour le même paramètre (JPQL)

Parce que @Query doit être corrigé au moment de la compilation en utilisant JPQL ou même une requête native rendra ce genre de choses difficiles à implémenter, en particulier de manière sûre.

Je réalise donc que vous recherchez la solution JPQL, mais c'est une formidable opportunité d'apprendre et de tirer parti de la Specification interface et CriteriaQuery de JPA. C'est exactement pour ça.

Jetez un œil au dépôt suivant :

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[]{}));
            }
        };
    }

}

Cela peut sembler un peu complexe, mais en réalité, ce n'est pas le cas lorsque vous vous y familiarisez. L'utilisation est simple, comme :

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