Почему PagingAndSortingRepository<City, Long> возвращает неправильный порядок сортировки после метода findAll(Pageable)? На уровне обслуживания у меня есть этот метод, и я пытаюсь отсортировать его по населению:

    public Set<City> findAllPageable(int page, int size, String sortBy) {
        Pageable paging = PageRequest.of(page, size, Sort.by(sortBy));
        return new HashSet<>(repository.findAll(paging).getContent());
    }

Вот что я ожидал увидеть:

    select Population from city order by Population limit 10;
42
167
300
455
503
559
595
682
700
800

И это фактический результат после итерации Set<City>:

682, 42, 300, 700, 559, 595, 800, 167, 455, 503

Все эти числа верны, но порядок неверен. Почему?

1
Ilja Tarasovs 29 Авг 2020 в 23:17

2 ответа

Лучший ответ

Вы не можете полагаться на элементы заказа, возвращенные в HashSet. Если вам необходимо использовать там набор, используйте {{ X1}}, что гарантирует порядок:

return new LinkedHashSet<>(repository.findAll(paging).getContent());
2
Mureinik 29 Авг 2020 в 20:20

Возвращенная реализация HashSet не поддерживает порядок сортировки городов.

Используйте реализацию TreeSet и передайте либо Comparator<City>, либо позвольте City реализовать Copmarable<City>. Я также предлагаю вам вернуть SortedSet<City> в этом случае.

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

public SortedSet<City> findAllPageable(int page, int size, String sortBy) {
     Pageable paging = PageRequest.of(page, size, Sort.by(sortBy));
     return new TreeSet<>(
         repository.findAll(paging).getContent(), 
         Comparator.comparing(City::getPopulation));
}
1
Nikolas 29 Авг 2020 в 20:22