Cha*_*ert 8 sql hibernate join cartesian-product cross-join
我遇到Hibernate生成无效SQL的问题.具体来说,混合和匹配隐式和显式连接.这似乎是一个开放的bug.
但是,我不确定为什么这是无效的SQL.我想出了一个生成相同语法异常的小玩具示例.
CREATE TABLE Employee (
employeeID INT,
name VARCHAR(255),
managerEmployeeID INT
)
Run Code Online (Sandbox Code Playgroud)
INSERT INTO Employee (employeeID, name) VALUES (1, 'Gary')
INSERT INTO Employee (employeeID, name, managerEmployeeID) VALUES (2, 'Bob', 1)
Run Code Online (Sandbox Code Playgroud)
这两个查询都有效.我意识到有笛卡尔积; 那是故意的.
明确的加入:
SELECT e1.name,
e2.name,
e1Manager.name
FROM Employee e1
CROSS JOIN Employee e2
INNER JOIN Employee e1Manager
ON e1.managerEmployeeID = e1Manager.employeeID
Run Code Online (Sandbox Code Playgroud)
隐含的JOIN:
SELECT e1.name,
e2.name,
e1Manager.name
FROM Employee e1,
Employee e2,
Employee e1Manager
WHERE e1.managerEmployeeID = e1Manager.employeeID
Run Code Online (Sandbox Code Playgroud)
此查询不适用于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
Run Code Online (Sandbox Code Playgroud)
在MS2000中,我收到错误:
列前缀"e1"与查询中使用的表名或别名不匹配.
在MySQL中,错误是:
'on子句'中的未知列'e1.managerEmployeeID'.
Bil*_*win 13
它会导致错误,因为根据SQL标准,JOIN
关键字的优先级高于逗号.关键点是,在子句中评估了相应的表之后,表别名才可用FROM
.
因此,当您e1
在JOIN...ON
表达式中引用时,e1
尚不存在.
我在研究Hibernate时请等待,并了解是否可以说服它JOIN
在所有情况下使用.
嗯.Hibernate.org上的所有内容似乎都会重定向到jboss.org.因此,现在无法在线阅读HQL文档.我相信他们最终会找出他们的名字.