1

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

4

1 回答 1

3

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

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

在 Hibernate 中,它并不那么明显(或有据可查),但您应该能够将示例中的“ where ”替换为“ with ”,并且当它将 HQL 转换为 SQL 时,它应该将其放在“on”子句中.

于 2013-10-04T04:31:16.800 回答