繁体   English   中英

Spring Data Rest - 按多个属性排序

[英]Spring Data Rest - Sort by multiple properties

我有一个实体如下

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

有没有办法指定多个排序顺序?

谢谢!

解决方案(tl; dr)

想要对多个字段进行排序时,只需在URI中多次放置sort参数即可。 例如your/uri?sort=name,asc&sort=numberOfHands,desc 然后,Spring Data能够构造具有多种种类的Pageable对象。

说明

对于如何为URI中的参数提交多个值,并没有真正定义的标准。 请参阅在GET请求中为同一参数名称传递多个值的正确方法

但是, Java Servlet规范中有一些信息提示Java Servlet容器如何解析请求参数。

getParameterValues方法返回一个String对象数组,其中包含与参数名称关联的所有参数值。 ...- Java Servlet规范,第3.1节

该部分中的样本进一步说明(尽管它混合了请求数据和正文数据)

例如,如果使用查询字符串a=hello和帖子正文a=goodbye&a=world发出请求,则结果参数集将被排序为a=hello, goodbye, world

此示例示出的是,当参数( a在实施例)被呈现多次将结果汇总成一个String[]

以下是手动/编程构造多重排序对象的方法。

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

注意:此解决方案不能直接解决最初提出的问题,但可以帮助寻求此问题的访问者在搜索解决方案时从后端角度/以某种“硬编码”方式对多个属性进行排序。 (此解决方案不需要/不使用任何URI参数)

当存在动态字段时,您只需与字段匹配并添加排序列表即可。

List<Sort.Order> sorts= new ArrayList<>();
if (sort == "name" && sortingOrder.equalsIgnoreCase("DESC")) {
   sorts.add(new Sort.Order(Sort.Direction.DESC,"name"));
} else if (sort == "numberOfHands" && sortingOrder.equalsIgnoreCase("DESC")) {
  sorts.add(new Sort.Order(Sort.Direction.DESC,"numberOfHands"));
}
     
return personRepository.findAll(Sort.by(sorts)); 

如果您使用的是分页,则直接添加 PageRequest 请求。

return personRepository.findPersons(PageRequest.of(pageNo, pageSize, Sort.by(sorts)));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM