Я думаю, что лучшим выбором в вашем случае является спецификации-arg-resolver lib, который предоставляет удобный способ декларативного построения спецификации.Например, этот код:
@RequestMapping("/customers")
public Object findByName(
@And({
@Spec(path="registrationDate", params="registeredBefore", spec=DateBefore.class),
@Spec(path="lastName", spec=Like.class)}) Specification<Customer> customerSpec) {
return customerRepo.findAll(customerSpec);
}
соответствует этому запросу:
GET http://myhost/customers?registeredBefore=2015-01-18&lastName=Simpson
Он поддерживает следующие спецификации: Like, LikeIgnoreCase, Equal, EqualIgnoreCase, In, Null, NotNull,GreaterThan, GreaterThanOrEqual, LessThan, LessThanOrEqual, DateBetween, Join, Join fetch и позволяет объединять их, составляя сложные выражения.
Другой вариант - Querydsl и Веб-поддержка Расширения Spring Data.Он также позволяет создавать «язык запросов REST», но имеет меньше возможностей.Вы можете прочитать в моем ответе, как его использовать: https://stackoverflow.com/a/48596145