问题描述
为什么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));
}