Hibernate LEFT JOIN HQL查询无法正确计算条件

时间:2013-10-01 15:16:36

标签: hibernate hql left-join substring

我正在使用以下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是否为null时)。如何使用子字符串的条件,还包括没有调色板的结果?

1 个答案:

答案 0 :(得分:3)

在直接SQL中,假设您只有查询: select * from A left outer join B on A.x=B.x。我们的结果每A至少有一行,如果没有B,我们将在这些行上有空列。现在假设我们添加了where B.y=1。 DB将首先执行外连接,然后它将应用where子句。空值不等于任何值,因此它会抛弃所有这些行。你最终会包括只有A的A,而不是你所期待的!

SQL中的解决方案是将其添加到“on”子句,即select * from A left outer join B on A.x=B.x and B.y=1。在这种情况下,DB将在外连接期间应用它,因此它不会丢弃记录。

在Hibernate中,它并不那么明显(或者有很好的文档记录),但你应该能够在你的例子中用“ with ”替换“ where ”,当它将HQL转换为SQL,它应该将它放在“on”子句中。