我遇到了 Hibernate 生成无效 SQL 的问题。具体来说,混合和匹配隐式和显式连接。这似乎是一个开放的错误。
但是,我不确定为什么这是无效的 SQL。我想出了一个生成相同语法异常的小玩具示例。
架构
CREATE TABLE Employee (
employeeID INT,
name VARCHAR(255),
managerEmployeeID INT
)
数据
INSERT INTO Employee (employeeID, name) VALUES (1, 'Gary')
INSERT INTO Employee (employeeID, name, managerEmployeeID) VALUES (2, 'Bob', 1)
工作 SQL
这两个查询都有效。我意识到有一个笛卡尔积;这是故意的。
显式连接:
SELECT e1.name,
e2.name,
e1Manager.name
FROM Employee e1
CROSS JOIN Employee e2
INNER JOIN Employee e1Manager
ON e1.managerEmployeeID = e1Manager.employeeID
隐式连接:
SELECT e1.name,
e2.name,
e1Manager.name
FROM Employee e1,
Employee e2,
Employee e1Manager
WHERE e1.managerEmployeeID = e1Manager.employeeID
无效的 SQL
此查询不适用于 MSSQL 2000/2008 或 MySQL:
SELECT e1.name,
e2.name,
e1Manager.name
FROM Employee e1,
Employee e2
INNER JOIN Employee e1Manager
ON e1.managerEmployeeID = e1Manager.employeeID
在 MS2000 中,我收到错误:
列前缀“e1”与查询中使用的表名或别名不匹配。
在 MySQL 中,错误是:
“on 子句”中的未知列“e1.managerEmployeeID”。
问题)
- 为什么这个语法无效?
- 奖励:有没有办法强制 Hibernate 只使用显式 JOIN?