2015-06-10 28 views
0

我的工作我的方式來此SQL查詢(測試並且按照預期工作):,這是什麼SQL查詢相當於HQL查詢(內蒙古取最大值加入)

SELECT c.carId, p.color as currentColor 
FROM Car c 
Inner join Paint p 
ON(p.PaintId In (Select max(p2.PaintId) From Paint p2 where p2.carId = c.carId)) 

什麼相當於HQL查詢? (假設類名稱和屬性與數據庫表/列相同)

請注意,使用'通過paintId命令'和setMaxResults不是選項。我需要讀取查詢裏面的currentColor,因爲我需要在WHERE語句後


附加信息使用此

我有2個實體DB:汽車和油漆,其中汽車可以有一個或許多油漆。

例如這個查詢將獲取最新的塗料車carId = 15

Select max(p2.PaintId) From Paint p2 where p2.carId = 15 

我試圖創建一個查詢,我可以通過他們最近的油漆(最大paintId)過濾器的汽車。 所需的輸出應該是Car Class的實例。每行一個實例,因此,HQL語句應該像

Select distict c 
From Car c 
... 
+0

什麼是你想要的輸出,即應休眠返回一個'Car'實例列表或一個簡單的'Object []'? – mabi

+0

@mabi,好點,我編輯了我的問題來回答你。我需要一個Car實例列表。 – yannicuLar

回答

1

因爲它是一個內部聯接,你不選擇子句中使用P2,可以將子查詢移到where子句。

SELECT c.carId, s.color as currentColor 
FROM 
    Car c, 
    Paint p 
WHERE 
    p.PaintId In (
    Select max(p2.PaintId) 
    From Paint p2 
    where p2.carId = c.carId) 

(順便說一下,s不會在您的查詢存在。)


編輯:讀您的附加信息後:

如果汽車最多隻能有到兩種顏色,我想知道爲什麼你不只是把它加載到內存中,並以面向對象的方式進行:

var car = session.Query... 
var carsLastPaint = oneCar.Paints.Last(); 

可以使用特殊功能maxindex並在油漆列表訪問的最後一個值:

select c as car, p as lastPaint 
from Car c join c.Paints p 
where 
    p = c.Paints[maxindex(c.Paints)] 
    and c.id = :carId 

看吧在Hibernate documentation的更加偉大的功能:-)

+0

Where語句中沒有性能懲罰檢查,而不是Inner Join On/With? – yannicuLar

+0

我不這麼認爲。執行計劃甚至可能是相同的。 –

+0

我已經解決了我的問題,只需將您的支票從「Join」語句移至「Where」,就像您指出的那樣。但'maxindex'可能很快就會派上用場。非常感謝 ! – yannicuLar