我遇到Hibernate生成无效SQL的问题.具体来说,混合和匹配隐式和显式连接.这似乎是一个
open bug.
但是,我不确定为什么这是无效的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
隐含的JOIN:
SELECT e1.name,e1Manager.name FROM Employee e1,Employee e2,Employee e1Manager WHERE e1.managerEmployeeID = e1Manager.employeeID
无效的SQL
此查询不适用于MSSQL 2000/2008或MySQL:
SELECT e1.name,Employee e2 INNER JOIN Employee e1Manager ON e1.managerEmployeeID = e1Manager.employeeID
在MS2000中,我收到错误:
The column prefix ‘e1’ does not match
with a table name or alias name used
in the query.
在MySQL中,错误是:
Unknown column ‘e1.managerEmployeeID’
in ‘on clause’.
问题(S)
>为什么这种语法无效?
> Bonus:有没有办法强制Hibernate只使用显式JOIN?
解决方法
它会导致错误,因为根据SQL标准,JOIN关键字的优先级高于逗号.关键点是,在FROM子句中评估了相应的表之后,表别名才可用.
因此,当您在JOIN … ON表达式中引用e1时,e1尚不存在.
我在研究Hibernate时请等待,并了解在所有情况下是否可以说服它使用JOIN.
嗯. Hibernate.org上的所有内容似乎都会重定向到jboss.org.因此,现在无法在线阅读HQL文档.我相信他们最终会找到他们的名字.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。