按具有 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);
我正在使用 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);