2013-10-01 73 views
0

正確計數我使用下面的HQL:休眠LEFT JOIN HQL查詢不能與條件

SELECT lo.id, lo.priority, COUNT(p.id) 
FROM LoadingOrder AS lo LEFT OUTER JOIN lo.palettes AS p 
WHERE SUBSTRING(p.space.id, 1, 1) = 'B' 

問題是,它並沒有給我裝令行禁止調色板。如果沒有WHERE子句,它將顯示沒有調色板的加載順序(最後一列等於0)。

我已經嘗試添加這樣的事情:

SELECT lo.id, lo.priority, COUNT(p.id) 
FROM LoadingOrder AS lo LEFT OUTER JOIN lo.palettes AS p 
WHERE ((p.id IS NULL) OR (SUBSTRING(p.space.id, 1, 1) = 'B')) 

,但它並不能幫助(也當我檢查,如果p或p.space.id爲空)。如何使用子字符串的條件,還包括沒有調色板的結果?

回答

1

在直連SQL中,假設您只有查詢: select * from A left outer join B on A.x=B.x。我們的結果每A至少有一行,如果沒有B,我們將在這些行上有空列。現在假設我們添加where B.y=1。數據庫將首先執行外連接,然後它將應用where子句。空值不會等於任何東西,所以它會拋出所有這些行。你最終會只包括具有B的A,而不是你所期待的!

SQL中的解決方案是將此添加到「on」子句,即select * from A left outer join B on A.x=B.x and B.y=1。在這種情況下,數據庫將在外部聯接期間應用此操作,因此它不會丟棄記錄。

在Hibernate中,它不是那麼明顯(或有據可查),但你應該能夠只需更換「其中」與「」,當它轉化的HQL到SQL,它應該你的榜樣將它放在「on」子句中。

+0

非常感謝!如果沒有關於「with」關鍵字的知識,就不可能解決它:/ – GUZ