Поиск всех столбцов для соответствия ключевому слову с Spring JPA - PullRequest
0 голосов
/ 04 ноября 2019

Я строю службу отдыха с Spring Boot. Я использовал Spring Data JPA для запросов, но я открыт для всего, что поможет решить мою проблему.

Я хочу найти все записи в базе данных с подходящей строкой в ​​любом столбце.

Что-то вроде строк, FindAllBy(all 20 columns)(String parameter) или SELECT * FROM AllColumns() WHERE parameter = "Foo";

У меня есть объект с почти 20 атрибутами, поэтому я хотел бы избежать записи всех имен столбцов в поиске.

Как я мог это сделать?

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Этот URL (https://www.baeldung.com/rest-api-search-language-spring-data-specifications) поможет вам, я скопировал некоторый код из URL, чтобы объяснить вам.

вам необходимо определить класс критериев

public class SearchCriteria {
    private String column;
    private String operation;
    private Object value;
}

Затем вам нужно определить свою поисковую спецификацию

public class SearchSpecification implements Specification<MyEntity> {

    private SearchCriteria criteria;

    private SearchSpecification(SearchCriteria criteria){
        this.criteria =criteria;
    }

    @Override
    public Predicate toPredicate
      (Root<User> root, CriteriaQuery<?> query, CriteriaBuilder builder) {


        if (criteria.getOperation().equalsIgnoreCase(":")) {
            if (root.get(criteria.getColumn()).getJavaType() == String.class) {
                return builder.like(
                  root.<String>get(criteria.getColumn()), "%" + criteria.getValue() + "%");
            } 
        }
        return null;
    }
}

Тогда, наконец, вы можете изменить свой репозиторий, расширив JpaSpecificationExecuto r

public interface MyRepository 
  extends JpaRepository<User, Long>, JpaSpecificationExecutor<MyEntity> {}

Теперь вы можете создать спецификацию для каждого столбца для вашего случая все двадцать столбцов

SearchSpecification spec1 = 
              new SearchSpecification(new SearchCriteria("column1", ":", "searchVal"));

SearchSpecification spec2 = 
              new SearchSpecification(new SearchCriteria("column2", ":", "searchVal"));

SearchSpecification spec3 = 
              new SearchSpecification(new SearchCriteria("column3", ":", "searchVal"));

Затем вам нужно выполнить запрос, например

List<MyEntity> results = 
      repository.findAll(Specification.where(spec1).or(spec2).or(spec3));
0 голосов
/ 04 ноября 2019

Это единственный способ поиска строки во всех столбцах SELECT * FROM yourTable WHERE field1 LIKE '% value%' или field2 LIKE '% value%' ......;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...