Spring Data Rest - 按多个属性排序

rak*_*pan 50 spring spring-data spring-data-jpa spring-data-rest

我有一个实体如下

Class Person{
String id;
String name;
String numberOfHands;
}
Run Code Online (Sandbox Code Playgroud)

使用Spring Data Rest(Gosling Release Train),我可以指定

localhost/Person?sort=name,asc
Run Code Online (Sandbox Code Playgroud)

用于排序名称升序.现在,在我需要按numberOfHands降序排序并命名升序的情况下.我可以指定

localhost/Person?sort=numberOfHands,name,asc
Run Code Online (Sandbox Code Playgroud)

但是,我无法指定

localhost/Person?sort=numberOfHands,desc,name,asc
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

M. *_*num 80

解决方案(tl; dr)

想要对多个字段进行排序时,只需将sort参数多次放在URI中即可.例如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多次显示参数(在示例中)时,结果将聚合为a String[].


Pim*_*oek 19

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

Sort sort = Sort.by(
    Sort.Order.asc("name"),
    Sort.Order.desc("numberOfHands"));
return personRepository.findAll(sort);
Run Code Online (Sandbox Code Playgroud)

注意:此解决方案并不直接解决原始问题,但可以帮助访问者在搜索解决方案时如何从后端角度/以某种"硬编码"方式对多个属性进行排序.(此解决方案不需要/接受任何URI参数)