sql >> Database >  >> RDS >> Mysql

Spring Boot JPA:meerdere waarden doorgeven voor dezelfde parameter (JPQL)

Omdat @Query moet worden opgelost tijdens het compileren met behulp van JPQL of zelfs een native query maakt dit soort dingen moeilijk te implementeren, vooral op een typeveilige manier.

Dus ik realiseer me dat je op zoek bent naar een JPQL-oplossing, maar dit is een geweldige kans om te leren en te profiteren van Specification interface en JPA's CriteriaQuery. Dit is precies waar het voor is.

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

}

Het ziet er misschien een beetje ingewikkeld uit, maar dat is het niet als je er vertrouwd mee raakt. Het gebruik is eenvoudig, zoals:

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



  1. Illegale mix van sorteerfouten in MySql

  2. Hoe kan ik drie tabel JOIN's doen in een UPDATE-query?

  3. Hoe kan ik een waarde opvragen in de SQL Server XML-kolom?

  4. SQL Server, een benoemd exemplaar converteren naar een standaardexemplaar?