2017-02-24 84 views
0

因此,我們有2個對象分別映射到數據庫表。Hibernate Complex加入

public class Dispute { 
    private Long disputeSeqNo; 
    private List<StatusInfo> statusInfos; 
} 

public class StatusInfo { 
    private Long statusSeqNo; 
    private Date createdDt; 
    private String statusCd; 
    private Dispute dispute; 
} 

爭議可以有0個或多個StatusInfo與它關聯。

當前hibernate正在爲每個Dispute返回所有StatusInfo對象。雖然在某些情況下這是需要的。但是我有一個用例,其中:

  • 我只需要顯示最近StatusInfo每個爭議。
  • 此外,在同一顯示器上,我需要按最近的StatusInfo.statusCd值進行排序的功能。這種排序需要在數據庫中進行,因爲我的顯示是分頁的(使用休眠分頁功能)。 (這實際上沒有選擇檢索後排序數據,因爲將有許多行數據。)

我知道只使用普通SQL我可以做到這一點,努力將其轉化爲HQL。

有關如何通過HQL解決此問題的任何想法?我仍然回來的地方:

List<Dispute> 

感謝您的反饋。

謝謝!

+0

請添加適用於您的案例的sql查詢 –

+0

您不能。爭議的地位是爭議的地位。他們全部。它不依賴於你從數據庫中解決爭議的方式。如果您想要爭議的最新statusInfo,您需要一個選擇StatusInfo的查詢。類似於'從爭議d選擇爭議,statusInfo d加入d.statusInfos statusInfo其中...'。 –

回答

0

您需要做的第一件事是在下面定義一個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 ... 
    } 
} 
+0

看起來像我一直在尋找的確切的信息。我一定會試試這個!非常感謝。 –

+0

這正是我所需要的。我可以看到這些過濾器在哪裏非常有用。真的很感謝你在這裏打鳴。 –

+0

@PaulAckley很高興爲您提供幫助。 – Naros