【问题标题】:Sorting a list based on multiple fields and each fields can be in different directions根据多个字段对列表进行排序,每个字段可以在不同的方向
【发布时间】:2018-02-06 18:02:22
【问题描述】:

寻找排序员工类的列表

class Employee {

String name;
int age;
String dob;    
}

我希望对列表进行排序,例如如果名称相等则年龄如果年龄也相等则检查 dob。 所有这些都可以在不同的方向。例如

姓名可以升序,年龄可以降序。

我在 Rest Controller 中使用的 URL 有

orderBy=name,desc&orderBy=age,asc&&orderBy=dob,asc

我正在寻找使用 Pageable 的 Spring Data JPA。

但问题是数据库中的出生日期是字符串。

所以我需要将其转换为日期。

然后我想到了在 Guava 中订购的下一个选项。

Ordering<Employee> orderPrimary = Ordering.natural().onResultOf(new EmployeeOrderByName());

Ordering<Employee> orderSecondary = Ordering.natural().reverse().onResultOf(new EmployeeOrderByAge()); 
orderPrimary.compound(orderSecondary);

但是在 Url 中的字段可以是不同的顺序,可以是不同的方向,这里我不确定如何进行。

满足我要求的任何最佳方法。

【问题讨论】:

  • 你的意思是“但是在 URL 中的字段可以有不同的顺序”?您的休息控制器应采用Pageable,它将在List 中包含字段。无论它们在列表中的顺序如何,都应该是您需要比较的顺序。
  • @tsolakp 就像我在使用可分页时提到的,问题是数据库中的出生日期是字符串,所以我必须将其转换为日期。不确定在这种情况下 pageable 将如何工作。 “但在 Url 字段中可以采用不同的顺序” - 是的,我将使用列表中的顺序
  • 内存排序的问题是您需要在数据库中进行排序才能获得正确的分页数据。否则,您必须加载所有数据,然后在内存中进行分页和排序,这可能会变得非常昂贵。
  • 你使用的是什么数据库,postgres 还是 mysql 或其他?根据 rdbms 及其版本,您可以通过 SQL 转换函数将 String 转换为日期,您可以从中订购。
  • @Aroniaina MySQL,你能详细说明一下吗

标签: java spring sorting jpa guava


【解决方案1】:

您可以尝试使用 @Converter 将 dob 字符串转换为日期/从日期,然后在条件或查询中使用 order by .... 但您需要进行一些试验和错误,因为转换器不能很好地工作有查询(很可能也有条件)...here is a tutorial on Converter

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-10
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    相关资源
    最近更新 更多