我使用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属性或者那个问题?
答案 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);