2013-10-01 50 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