2017-03-07 19 views
1

我有我的實體的投影,我需要通過內部類的字段進行排序。這是我的實體的一部分:春天的數據其餘投影排序

class Person { 
    UUID guid; 
    Set<DisabilityHistory> disabilityHistory; 
} 
class DisabilityHistory { 
    Date createdDate; 
} 

我知道sort PARAM但要求如​​3210不起作用。我發現的唯一解決方案是在我的實體中使用@OrderBy註釋,但在這種情況下,它會一直排序,我擔心性能。

回答

2

這不會起作用,因爲您試圖對實體中的內部字段進行排序,因此您無法在數據庫級別執行此操作。我用過的方法是使用SpELProjection類中對它進行排序。這是你如何能做到這一個例子:

@Projection(
     name = "sorted", 
     types = Person.class 
) 
public interface PersonProjection { 

    @Value("#{@personProjectionHelper.sortedByDisabilityHistory(target.disabilityHistory)}") 
    List<DisabilityHistory> getDisabilityHistory(); 
} 

而且在Java中實現排序:

@Component 
public class PersonProjectionHelper { 

    public List<DisabilityHistory> sortByDisabilityHistory(final List<DisabilityHistory> list) { 
     // do the sorting on Java level 
    } 
} 
+0

難道我們必須以某種方式注入PersonProjectionHelper抑或是自動拾取?如果是這樣 - 怎麼做? – Piotr

+0

不,你只是將它聲明爲一個組件,它會自動被拾取,所以如果它在春天的上下文中 - 你只是通過bean名稱使用它,在這種情況下,使用'personProjectionHelper'。 –

+0

是的,謝謝它的工作。我忘了在@ -Value聲明的開頭添加散列,並且得到了500個帶有一些不清楚的堆棧跟蹤。我認爲這是因爲它找不到我的@組件。 – Piotr