sql >> Base de Datos >  >> RDS >> Mysql

Spring Boot JPA:Paso de múltiples valores para el mismo parámetro (JPQL)

Porque @Query debe corregirse en tiempo de compilación usando JPQL o incluso la consulta nativa hará que este tipo de cosas sean difíciles de implementar, especialmente de una manera segura.

Así que me doy cuenta de que está buscando la solución JPQL, pero esta es una oportunidad increíble para aprender y aprovechar las Specification interfaz y CriteriaQuery de JPA. Esto es exactamente para lo que es.

Echa un vistazo al siguiente repositorio:

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

}

Puede parecer un poco complejo, pero en realidad no lo es cuando te familiarizas con él. El uso es simple, como:

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