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

Spring Boot JPA:Sender flere værdier for samme parameter (JPQL)

Fordi @Query skal rettes på kompileringstidspunktet ved hjælp af JPQL eller endda native forespørgsler vil gøre denne slags ting svære at implementere, især på en typesikker måde.

Så jeg er klar over, at du er ude efter JPQL-løsning, men dette er en fantastisk mulighed for at lære og drage fordel af Specification interface og JPA's CriteriaQuery. Det er præcis, det er til.

Tag et kig på følgende lager:

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

}

Det ser måske lidt komplekst ud, men det er det faktisk ikke, når du bliver fortroligt med det. Brugen er enkel, f.eks.:

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



  1. Hvordan konverterer man en streng til hex og omvendt?

  2. DB-migrering med NextForm Multi-Table Wizard

  3. SQLite MELLEM

  4. Hvad er denne operator <=> i MySQL?