2012-03-14 147 views
2

我正在使用JPQL從Play Framework進行模型查詢。如何在JPQL中執行復雜的LEFT JOIN條件?

我不知道JPQL是否支持LEFT JOIN的「複雜」ON條件。

在一個例子,我有,有2個表:

  • 「應用」 - 應用
  • 'AggregationHistory名單 - 每個應用程序的聚集記錄列表,每日期。在模型中,它具有代表 多到一個與「應用」(列名在物理表「APP_ID」)「應用」領域

假設我要計算所有的應用程序的列表不要有特定日期的記錄。

在普通的SQL,我使用下面的查詢得到的結果:

SELECT a.* FROM app a LEFT JOIN aggregationhistory ah 
ON a.id = ah.app_id AND ah.fromDate = '2012-03-14 00:00:00' 
WHERE ah.fromDate is NULL 

「與」在「ON」的條件是必不可少的,當然。

現在,所有JPQL的我看到的例子是這樣的:

SELECT a.* FROM AggregationHistory ah LEFT JOIN ah.app a WHERE ... 

所以,唯一的「ON」狀態的支持 - 是ID的「匹配」? (WHERE似乎沒有幫我多)

我能想到的解決方法(例如,使用「本地查詢」,或使用JOIN來獲取確實有記錄應用程序的列表,和比較)。但是我不知道我在SQL中所做的查詢是否可以轉換成JPQL。

感謝

回答

9

JPQL,據我所知,不支持ON條款,但HQL不支持他們。選擇使用with關鍵字雖然:

select a from App a 
left join a.history h with h.fromDate = :fromDate 
where h.fromDate is null 
+0

謝謝。只需澄清一件事......在目前的模型中,我沒有'a.history' - 只是'ah.app'。我試圖通過以下方法來完成它:FROM AggregationHistory ah RIGHT JOIN ah.app WITH a ah.fromDate =:fromDate。不幸的是:InvalidWithClauseException:with-clause表達式沒有引用with-clause關聯的from-clause元素。看起來像WITH期望使用'a'而不是'ah'。唯一的解決辦法是添加'a.history'?謝謝 – Max 2012-03-14 22:03:22

+0

老實說,我不知道。但是,雙向關聯極大地幫助制定查詢,因此即使從未在對象模型中使用(甚至暴露)也是有用的。 – 2012-03-14 22:09:37