按具有 Spring 数据的不同日期属性排序页面

Order Page by different Date Properties with Spring Data

我正在使用 Spring 数据访问带有映射对象的 SQL 数据库。 我有一个对象,它有多个日期属性,这些属性与对象的不同状态相关。

public class Foo {
 Date deadlineOne; // relevant in State.ONE
 Date deadlineTwo; // relevant in State.TWO
 Date deadlineThree; // relevant in State.THREE
 State state; // implemented via persisted Enum
}

现在,在 UI 中,我想用一个名为 'Next Deadline' 的 属性 显示这些对象,并且还能够按这方面进行排序。此 'Next Deadline' 应始终是相关州相关的最早日期。例如,如果我有以下对象:

O1{state:ONE, deadlineOne: '2016-06-14', deadlineTwo: '2016-06-16', deadlineThree: '2016-06-19'}
O2{state:TWO, deadlineOne: '2016-06-12', deadlineTwo: '2016-06-13', deadlineThree: '2016-06-20'}
O3{state:THREE, deadlineOne: '2016-06-15', deadlineTwo: '2016-06-18', deadlineThree: '2016-06-21'}

我希望它们按 'Next Deadline'

排序时这样显示
Object | Next Deadline | State
O2     | 2016-06-13    | TWO
O1     | 2016-06-14    | ONE
O3     | 2016-06-21    | THREE

我只是不知道如何使用 Spring 数据来实现此功能。到目前为止,我一直在使用 PageRequest 并通过传递对象的 属性 来进行基本排序。但是那样我就不能按照我需要的方式混合排序属性。

到目前为止我尝试了什么

JpaRepository 接口中使用 SQL Case 语法通过 JPA Query Annotaion 实现此功能:

@Query("SELECT f FROM Foo f ORDER BY CASE
WHEN f.state = State.ONE THEN f.deadlineOne
WHEN f.state = State.TWO THEN f.deadlineTwo
WHEN f.state = State.THREE THEN f.deadlineThree")
Page<Foo> findSortedByNextDeadline(Pageable pageable);

解释器似乎无法接受这一点,也没有提供任何有用的错误信息。

问题

有什么方法可以使 Spring 数据和正确的 Query/PageRequest 一起工作,还是我必须维护一个单独的 nextDeadline 属性 或类似的东西?

好的,我让它工作了,方法如下:

就像 Dimpre Jean-Sébastien 在他的评论中指出的那样,我缺少 END 关键字。我还必须向我的 state-属性 添加一个明确的 @Enumerated(EnumType.ORDINAL) (这仅与我的特定情况相关,它也应该适用于 String 类型)。我还用它的完整包名引用了我的状态的枚举。最后它看起来像这样:

@Query("SELECT f FROM Foo f ORDER BY CASE
WHEN f.state = com.package.State.ONE THEN f.deadlineOne
WHEN f.state = com.package.State.TWO THEN f.deadlineTwo
WHEN f.state = com.package.State.THREE THEN f.deadlineThree
ELSE f.deadlineOne END")
Page<Foo> findSortedByNextDeadline(Pageable pageable);