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

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

谢谢!

原文由 rakpan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 858
2 个回答

解决方案(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[] 中。

原文由 M. Deinum 发布,翻译遵循 CC BY-SA 3.0 许可协议

以下是如何手动/以编程方式构建多排序对象。

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

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

原文由 BitfulByte 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题