使用Spring数据按不同日期属性排序页面

时间:2016-06-16 11:33:09

标签: java sql spring spring-data spring-data-jpa

我使用Spring Data访问带有映射对象的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'并且能够按这方面排序。这个'下一个截止日期'应该始终是相关国家最早的相关日期。例如,如果我有以下对象:

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'}

我希望它们按照'下一个截止日期'

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

我无法弄清楚如何使用Spring Data实现此功能。到目前为止,我一直在使用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 Data和正确的Query / PageRequest,还是我必须维护一个单独的nextDeadline属性或者那个问题?

1 个答案:

答案 0 :(得分:1)

好吧,我让它工作了,这是如何:

像Dimpre一样Jean-Sébastien在评论中指出我错过了END关键字。我还必须在我的state-property中添加一个显式的@Enumerated(EnumType.ORDINAL)(这在我的特定情况下是相关的,它应该也适用于String类型)。我还用完整的包名称引用了我的州的Enum。最后它看起来像这样:

@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);