2009-01-14 21 views
1

下面的類結構給出:解決JPA查詢發現在連接列表中的最後一項

class Job 
{ 
    String description; 
    Collection<JobHistory> history; 
} 

class JobHistory 
{ 
    Date assignDate; 
    User jobOwner; 
} 

class JobOwner 
{ 
    String name; 
    String id; 
} 

該類結構是通過JPA的數據庫訪問。在DAO層,我可以用JPA語法編寫查詢。

的問題:我想用JobJobHistory條目具有給定的ID,誰是在工作的Jobhistory(由assignDate訂購)的最後一個給定的所有者列表。聽起來很複雜,也許更簡單:給我所有的工作和JobHistory,其中指定的所有者是工作的實際所有者。

更新:爲了清楚起見,我會稍微更改類的名稱。

class Job 
{ 
    String description; 
    Collection<JobOwnerHistory> history; 
} 

class JobOwnerHistory 
{ 
    Date assignDate; 
    User jobOwner; 
} 

class JobOwner 
{ 
    String name; 
    String id; 
} 

每個Job具有由assignDate解決了他的主人的歷史。實際所有者獲得了最後分配的工作(即MAX(assignDate))。我想爲每個作業尋找JobOwnerHistory條目MAX(assignDate)對於特定用戶User

+0

您需要顯示映射。 – 2009-01-14 10:26:55

+0

映射可以隱含於準體「實體」中:作業0:M JobHistory,用戶0:M作業。 – cletus 2009-01-14 10:29:30

回答

1

嘗試:

SELECT j, j.history FROM Job j JOIN User u WHERE u.name = :name 

如果我是這樣做的EclipseLink的,我會稍微改變:

public List<Job> getAllJobsForUser(String username) { 
    List<Job> jobs = entityManager 
    .createQuery("SELECT j FROM Job j JOIN User u WHERE u.name = :name") 
    .setParameter("name", username) 
    .setHint(QueryHints.BATCH, "j.history") 
    .queryForList(); 
} 

的區別?在第一個版本中,你要返回兩個對象,所以你必須從List或Object數組中檢索它們,而在第二個版本中,查詢提示只是從一個(假設的)一對一的關係中加載所有的作業歷史。

我不知道Hibernate是否與此相當。 Toplink Essentials沒有。但這是我最喜歡的EclipseLink功能之一。

哦,顯然你可以(也可能應該)使用命名查詢,而不是像我這樣做的特殊查詢(因爲可以在構建過程中驗證這些查詢)。

2

我發現查詢如下回答:

SELECT j, h FROM Job j JOIN j.history h JOIN h.jobOwner u 
WHERE u.name = :name AND 
    (SELECT MAX(h2.assignDate) FROM Job j2 JOIN j2.history h2 
    WHERE h2 member of j.history) = h.assignDate 

查詢中的最重要的部分是MAX(h2.assignDate),因爲我想要得到這份工作,並在業主歷史上最新的條目中的子查詢。