sql >> Databáze >  >> RDS >> Mysql

Spring Boot JPA:Předávání více hodnot pro stejný parametr (JPQL)

Protože @Query musí být opraveny v době kompilace pomocí JPQL nebo dokonce nativní dotaz ztíží implementaci tohoto druhu věcí, zejména typově bezpečným způsobem.

Takže si uvědomuji, že hledáte řešení JPQL, ale toto je skvělá příležitost naučit se a využít výhod Specification rozhraní a CriteriaQuery JPA. To je přesně pro to.

Podívejte se na následující úložiště:

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

}

Může to vypadat trochu složitě, ale ve skutečnosti tomu tak není, když se s tím seznámíte. Použití je jednoduché, jako:

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



  1. Proč find_in_set funguje, ale klauzule IN

  2. Problém s nasazením sestavy SSRS 2014

  3. Laravel:získání jedné hodnoty z dotazu MySQL

  4. Nastavení místní databáze SQL Server