2013-04-29 37 views
0

我有兩個實體:獲得另一張表的分組MAX結果JPQL

  • 帳戶,包含屬性ACCOUNTID
  • ImportRun,其中有一個屬性的runid。 ImportRun與Account之間存在一對多(雙向)關係。

可能有多個帳號具有相同的accountId,這些帳號引用具有不同runIds的不同ImportRuns(例如每天一個)。

我想爲給定的一組accountIds(這是一種業務鍵,而不是hibernate實體鍵)獲取最新的runIds,或者甚至更好,它們中的每個都引用最新的現有ImportRun(以便此ImportRun的runId具有所有由具有此accountId的帳戶引用的ImportRuns的最高runId)。換句話說:我想獲得最新的帳戶。 不幸的是,我不能使用原生SQL,那麼它會很容易。我已經設法做這種事情與JPQL只有一個給定accountId,但我無法弄清楚如何將幾個給定accountIds的每個runId的最大結果。

我如何使用JPQL做到這一點?

+0

就這樣我理解:「ImportRun與Account之間存在一對多(雙向)關係。」所以在帳戶中,你有這樣的事情? '@OneToMany私人清單 importRuns;' – 2013-04-29 15:24:16

+0

不,這正好相反。在ImportRun中,我有以下內容:列表。在Account中,有一個屬性importRun。爲了解釋這一點:每晚都有一批批進口一組賬戶。這批被稱爲「ImportRun」。因此,每個導入運行都有一個runId,這是一種標識運行時間的時間戳。現在,使用情況是獲得定義數量的賬戶,並給定其賬戶標識(業務密鑰) - 它們中的每一個都可以處於與不同runId完全不同的ImportRun中。我想獲得最新的。 – 2013-04-29 15:29:47

回答

2

下一次包括代碼,但要獲得最新的運行標識給定一組帳戶ID的:

SELECT a.accountId, MAX(r.runId) FROM Account a INNER JOIN a.importRun r WHERE a.accountId IN :accountIds GROUP BY a.accountId 

使用這個爛攤子一個JPA查詢來獲得最新的帳戶列表:

SELECT a FROM Account a INNER JOIN a.importRun r WHERE r.runId = (SELECT MAX(ri.runId) FROM Account ai INNER JOIN ai.importRun ri WHERE ai.accountId = a.accountId) 

希望這有助於!

+0

對不起,不包括代碼,非常感謝!奇蹟般有效! – 2013-04-30 05:52:31