您需要做的第一件事是在下面定義一個Hibernate過濾器。您可以簡單地在Dispute
類的頂部添加此註釋。
@FilterDef(name = "dispute-with-latest-statusinfo")
接下來,您需要在您的StatusInfo
收集如下將此命名過濾器:
@OneToMany(mappedBy = "dispute")
@Filter(
name = "dispute-with-latest-statusinfo",
condition = "statusinfo_id = (select max(si.statusinfo_id) from
StatusInfo si WHERE si.dispute_dispute_id = dispute_dispute_id")
private List<StatusInfo> statusInfos;
爲了滿足你的第一個要求,你可以通過啓用獲得Dispute
實例的列表以及它們的最新StatusInfo
在會話上執行過濾然後執行查詢:
session.enableFilter("dispute-with-latest-statusinfo");
List<Dispute> disputes = session
.createQuery("FROM Dispute d JOIN FETCH d.statusInfos", Dispute.class)
.getResultList()
爲了按照您的要求對結果進行排序問:
session.enableFilter("dispute-with-latest-statusinfo");
List<Dispute> disputes = session
.createQuery("FROM Dispute d JOIN FETCH d.statusInfos si ORDER BY si.status DESC", Dispute.class)
.getResultList()
現在,如果你不喜歡與包含這些情況下,單個元素的List<StatusInfo>
工作,你可以添加一個短暫的方法來幫助,這樣就可以獲取對象或獲取null
不不必擔心集合語義:
@Transient
public StatusInfo getLatestStatusInfo() {
if (statusInfos.isEmpty()) {
return null;
}
else if (statusInfos.size() == 1) {
return statusInfos.get(0);
}
else {
// you could add logic here to do the sort in-memory
// for cases where you may have the full collection
// but still want to obtain the last entry ...
}
}
請添加適用於您的案例的sql查詢 –
您不能。爭議的地位是爭議的地位。他們全部。它不依賴於你從數據庫中解決爭議的方式。如果您想要爭議的最新statusInfo,您需要一個選擇StatusInfo的查詢。類似於'從爭議d選擇爭議,statusInfo d加入d.statusInfos statusInfo其中...'。 –