findAllPageable返回错误的排序顺序

问题描述

为什么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

所有这些数字都是正确的,但是顺序是不正确的。为什么?

解决方法

您不能依靠contactDetails: {type: contact}中返回的order元素。如果必须在此处使用集合,请使用LinkedHashSet,以保证顺序:

HashSet
,

返回的HashSet实现不维护城市的排序顺序

使用TreeSet实现并传递Comparator<City>或让City实现Copmarable<City>。在这种情况下,我也建议您返回SortedSet<City>

根据元素的自然顺序或在设置创建时提供的Comparator来对元素进行排序,具体取决于所使用的构造函数。

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));
}