2016-05-10 39 views
1

假設你有以下實體:Spring Data JPA - 是否可以對計算出的屬性進行排序?

@Entity 
public class Game { 

    @Id 
    @GeneratedValue 
    private Integer id; 

    private String name; 

    private Calendar startTime; 
    private int durationInSeconds; 

    public GameStatus getStatus() { 
     if(startTime.after(Calendar.getInstance())) 
     { 
      return GameStatus.SCHEDULED; 
     } else { 
      Calendar endTime = Calendar.getInstance(); 
      endTime.setTime(startTime.getTime()); 
      endTime.roll(Calendar.SECOND, durationInSeconds); 

      if(endTime.after(Calendar.getInstance())) { 
       return GameStatus.OPEN_FOR_PLAY; 
      } 
      else { 
       return GameStatus.FINISHED; 
      } 
     } 
    } 
} 

如果我GameRepositoryPagingAndSortingRepository,我怎樣才能得到一個網頁的結果,由status屬性排序?

我目前得到:

java.lang.IllegalArgumentException: Unable to locate Attribute with the the 
given name [status] on this ManagedType [org.test.model.Game] 

,我可以因爲status理解確實沒有JPA屬性。有沒有解決的辦法?

(我使用Hibernate的下方,所以任何特定的Hibernate也行)

+2

也許更換你getStatus方法的一個公式,請參閱http://stackoverflow.com/a/29625652/180100 –

回答

5

的問題是,春數據的PageRequest排序是通過形成ORDER BY子句數據庫層上完成的。

您可以創建一個@Formula列,例如

@Entity 
public class Game { 
... 
    // rewrite your logic here in HQL 
    @Formula("case when startTime >= endTime then 'FINISHED' ... end") 
    private String status; 

然後,可以按排序順序使用新列,因爲您在公式中編寫的所有內容都將傳遞給ORDER BY子句。

+0

我接受了答案,因爲它可能是唯一的方法,但它似乎很難做所有的邏輯在1個HQL行中。 –

+0

您也可以使用計算的列創建數據庫視圖並將您的實體映射到視圖 – ike3

相關問題