2017-10-04 269 views
0

我期待創建一個REST控制器,它將返回各種對象的排序列表。使用JPA對集合進行分組和排序

我創建了一個DTO持有這些集合類似以下,但是這是行不通的,因爲它會組由實體:

public class AllReportsDTO { 

private List<AReport> aReports; 
private List<BReport> bReports; 
private List<CReport> cReports; 
... 
} 

然後我有以下的域對象

@Entity 
@Table(name = "a_report") 
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
public class AReport implements Serializable { 

private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 

@Column(name = "title") 
private String title; 

@Column(name = "description") 
private String description; 

@Column(name = "time_of_report") 
private ZonedDateTime timeOfReport; 

每個報告一個。

我想要做的是創建一個端點,它將返回所有這些報告的列表,但按照報告的時間順序,而不是按報告進行分組。我怎樣才能做到這一點?

我試過用HQL查詢將它寫入存儲庫並按時間分組,但問題是每個時間字段在每個報告中都有一個不同的名稱,因爲這個系統正在其他地方使用,所以我無法更改每個報告中的名稱。

+1

做獨立的類,爲您的「報告」實體的JSON表示與使用@JsonPropertyOrder –

+0

嗨Sujal , 非常感謝您的回覆。問題在於每個報告只有很少的變量是共同的,所以很難將JSON表示形式作爲一個常見的視圖。最大的問題是,當時的變量名稱的命名是不同的,我不能改變,所以很難訂購。 – Megadec

+1

我不明白。首先:一個'Set'會讓你的訂單時間過時,因爲它保證沒有訂單。你必須切換到'List'。第二:如果存在不同的實體,則通過單獨選擇它們並在每個查詢中按當前時間字段排序。 –

回答

1

我不會嘗試純粹的HQL解決方案或ORM的解決方案。我會去Java方式。

  1. 添加接口

    public interface ITimedReport { 
        ZonedDateTime getTime(); 
    } 
    
  2. 使所有的報表類通過返回自己的時間戳實現了這個接口
  3. 添加的方法getAllReportsAllReportsDTO。 此方法應填寫所有報告的List<ITimedReport>,然後使用Comparator<ITimedReport>對列表進行排序。該比較器將依靠getTime()進行比較。

您可以在界面中添加任何meaningfull的報告,像一個的getTitle,getDescription,...

+0

謝謝你Genu!這是一個非常優雅的解決方案。 – Megadec

2

您可以創建對您的集合進行排序的方法。嘗試去熟練使用這一個

Collections.sort(aReports, new Comparator<Object>() { 
    public int compare(MyObject o1, Object o2) { 
     return o1.getTimeOfReport().compareTo(o2.getTimeOfReport()); 
    } 
}); 
相關問題