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