LIKE + ИЛИ MySQL операция в JPARepository Spring Boot - PullRequest
0 голосов
/ 23 января 2019

Мне нужно получить данные из таблицы с такими условиями, как select * from table where (name LIKE '%xxx%' OR name LIKE '%yyy%' OR name LIKE '%xy%')

Класс репозитория JPA, который я написал, похож на

public List<Object> findByNameContaining(String[] name);

, который всегда возвращает ноль, но когда япередать только одну строку в качестве параметра, а затем я получаю ответ,

public List<Object> findByNameContaining("xxx");

Как передать список объектов в параметре метода findByNameContaining().

Ниже приведены ссылки, на которые я ссылался, который использует только один строковый объект в параметре

Как найти несколько как в JpaRepository Spring

% Like% Запрос весной JpaRepository

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Если я не ошибаюсь, невозможно иметь запросы как like in (a, b, c).В вашем случае вам придется либо сделать что-то вроде этого:

 @Query("select m from MyEntity m where m.name like ?1 or m.name like ?2 or m.name like ?3")
 List<MyEntity> findByNameContaining(String match1, String match2, String match3);

Это довольно ограниченно, хотя, конечно, если вы ожидаете динамический список like ... предложений.

В качестве альтернативы, вы можете работать со спецификациями:

public static Specification<MyEntity> findByNameContaining(List<String> matches) {
    return (root, query, cb) -> cb.or(matches
        .stream()
        .map(match -> cb.like(root.get("name"), match))
        .toArray(Predicate[]::new));
}

В этом случае вам нужно убедиться, что ваш репозиторий расширяет интерфейс JpaSpecificationExecutor, а затем вы можете назвать его так:

repository.findAll(findByNameContaining(..));
0 голосов
/ 23 января 2019

Вы используете собственный запрос

import com.example.entity.Foo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface FooRepository extends JpaRepository<Foo, Integer> {

    @Query(value = "SELECT * FROM Foo WHERE (name LIKE '%xxx%' OR name LIKE '%yyy%' OR name LIKE '%xy%'))", nativeQuery = true)
    List<Foo> getListOfFoo();

}
...