Подтвердить что ты не робот

Spring Data Rest - Сортировка по нескольким свойствам

У меня есть сущность ниже

Class Person{
String id;
String name;
String numberOfHands;
}

С Spring Data Rest (Gosling Release Train), я могу указать

localhost/Person?sort=name,asc

для сортировки имени имени по возрастанию. Теперь, в случае, когда мне нужно сортировать по numberOfHands по убыванию и по имени возрастать. Я могу указать

localhost/Person?sort=numberOfHands,name,asc

Но я не могу указать

localhost/Person?sort=numberOfHands,desc,name,asc

Есть ли способ указать несколько порядков сортировки?

Спасибо!

4b9b3361

Ответ 1

Решение (tl; dr)

При необходимости сортировки по нескольким полям вы просто добавляете параметр sort несколько раз в URI. Например your/uri?sort=name,asc&sort=numberOfHands,desc. Spring Затем данные могут создавать объект Pageable с несколькими сортировками.

Описание

На самом деле не существует определенного стандарта о том, как отправлять несколько значений для параметра в URI. См. Правильный способ передачи нескольких значений для одного имени параметра в запросе GET.

Однако в Java Servlet Spec есть информация, которая подсказывает, как параметры запроса синтаксического анализа Java-сервлетов.

Метод getParameterValues возвращает массив объектов String, содержащий все значения параметров, связанные с именем параметра.... - Java Servlet Spec, раздел 3.1

Далее в этом разделе указан пример (хотя он смешивает данные запроса и тела)

Например, если запрос выполнен с помощью строки запроса a=hello и тела сообщения a=goodbye&a=world, результирующий набор параметров будет упорядочен a=hello, goodbye, world.

Этот пример показывает, что когда параметр (a в примере) представлен несколько раз, результаты будут агрегированы в String[].

Ответ 2

Вот как создать объект Multi Sort вручную/программно.

Sort sort = Sort.by(
    Sort.Order.asc("name"),
    Sort.Order.desc("numberOfHands"));
return personRepository.findAll(sort);