2012-10-08 174 views
0

我有一個MySql這樣的查詢:轉換MySQL查詢JPA命名查詢

select AK.*, max(AA.activityDate) 
from AssessmentKey AK 
join AssessmentActivity AA on AA.ASSESSMENTKEY_ID = AK.id 
group by AK.id having max(AA.activityDate) <= '2012-10-02 17:30:55' 

有沒有辦法轉換成JPANamedQuery。我正在使用OpenJPA

如果我把它直接進入:

@NamedQuery(name = "AssessmentActivity.findByDate", 
    query = "select AK.*, max(AA.activityDate) from AssessmentKey AK 
      join AssessmentActivity AA on AA.ASSESSMENTKEY_ID = AK.id 
      group by AK.id having max(AA.activityDate) <= '2012-10-02 17:30:55'") 

錯誤在這裏顯示:select AK.*identifier expected, got "*"而且它不喜歡on,在這裏它說:

enter image description here

哪有我解決了這個問題?

回答

2

第一個問題:您應該用AK替換AK.*您只需要在此的實體別名。

第二個問題:連接語法不是這樣的。你應該寫:join並通過對象引用導航,如:AK.assesmentActivity並使用where關鍵字來代替on

這裏有一個提示加入:JPQL join

記住:你是在ORM,處理實體及其屬性,而不是數據庫外鍵和列。

(PS:也許你想寫一個NativeQuery在那裏,你可以使用本機SQL語法)

編輯: (您的評論),所以你必須從AA開始查詢:

select AK from AssesmentActivity AA join AssesmentKey AK where AA.assesmentKey = AK ... 

這樣你可以加入他們。

+0

謝謝,我會嘗試使用NativeQuery並讓你知道它是否工作。 –

+0

它與NativeQuery一起工作,謝謝。 –

+0

NativeNamedQuery只適用於當前表,它不會加載與該表相關的其他對象。所以我試圖做一個NamedQuery,但是加入語句存在問題。問題是,我不能這樣做:AK.assesmentActivity,因爲我的評估關鍵字沒有任何映射到評估活動,只有評估活動有評估關鍵對象的多對一映射。任何想法如何使其工作而無需更改數據庫,只是如何將此mysql查詢轉換爲jpql? –