我在使用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)
这两个查询均有效。我意识到有笛卡尔积;那是故意的。
明确加入:
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
此查询不适用于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”。
导致错误,因为根据SQL标准,JOIN关键字的优先级比逗号高。症结在于,表别名必须在子句中对相应表求值 后 才能使用FROM。
JOIN
FROM
因此,当您e1在JOIN...ON表达式中引用时,e1尚不存在。
e1
JOIN...ON
在我研究Hibernate时,请等待,并确定是否可以说服它JOIN在所有情况下使用。
嗯 Hibernate.org上的所有内容似乎都已重定向到jboss.org。因此,目前无法在线阅读HQL文档。我相信他们最终会弄清楚自己的名字的。