Spring Data Rest - 按多个属性排序

时间:2015-10-08 14:05:06

标签: spring spring-data spring-data-jpa 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

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

谢谢!

2 个答案:

答案 0 :(得分:66)

解决方案(tl; dr)

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

说明

对于如何在URI中为参数提交多个值,实际上没有定义标准。请参阅Correct way to pass multiple values for same parameter name in GET request

但是Java Servlet Spec中有一些信息暗示了Java servlet容器如何解析请求参数。

  

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

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

  

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

此示例显示,当多次显示参数(示例中为a)时,结果将汇总到String[]

答案 1 :(得分:11)

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

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

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