Можно ли использовать и комбинировать предложения WHERE в Spring Data Rest? - PullRequest
0 голосов
/ 01 октября 2019

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

Я обнаружил среду Spring Data REST, которая из коробки поддерживает базовые операции фильтрации, например:

/myEntities?field1=value1&field2=value2&sort=field2,desc&size=10&page=2

В этом случае мы просто фильтруем по 2 полям без каких-либо дополнительных предложений where.

Но что, если мне понадобится более сложный фильтр с другим количеством предложений where, order, limit для моих сущностей? Результирующий запрос может выглядеть примерно так:

SELECT * FROM table
WHERE field1 != `value1` and (field1 != ` value2 `OR (field1 = `value3` AND filed2 < 3))
AND field2 != 99

Можно ли достичь этой комбинации различных предложений where, используя встроенные функции Spring Data Rest (отправляя все эти вещи в виде параметров http)?

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

В конце концов, я использовал Spring Data Jpa + RSQL (Rest Query Language) на основе этой библиотеки

Это позволяет выполнять любую логику фильтрации с вложенными предложениями where на лету. Сам фильтр - это просто строка: String filter = "field1=='val1' and (field2=='val2' and (field3 > 56 or field4 > 23))";, так что вы можете передать любой фильтр (правильно построенный в терминах rsql, иначе он не сможет проанализировать ваш запрос) и легко изменить его при необходимости.

Библиотекасам переводит данный фильтр в Specification или Predicator (вы можете выбрать), также довольно легко добавить limit и orderBy к окончательному запросу, если вам это нужно.

0 голосов
/ 02 октября 2019

Вы должны иметь возможность настроить свой репозиторий, чтобы иметь метод поиска со всеми необходимыми параметрами. Затем они будут доступны Spring Data Rest под ресурсами поиска со всеми параметрами запроса.

Что-то вроде:

@RestResource(path = "weirdFilter", rel = "weirdFilter")
@Query(value = "SELECT * FROM table
WHERE field1 != :value1 and (field1 != :value2 OR (field1 = :value3 AND field2 < 3))
AND field2 != 99")
public Page<Stuff> findByWeirdFilter(@Param("value1") String value1, @Param("value2") String value2, @Param("value3") String value3, Pageable p);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...