sql – 混合隐式和显式JOIN

我遇到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文档.我相信他们最终会找到他们的名字.

相关文章

本篇内容主要讲解“sqlalchemy的常用数据类型怎么使用”,感...
今天小编给大家分享一下sqlServer实现分页查询的方式有哪些的...
这篇文章主要介绍“sqlmap之osshell怎么使用”,在日常操作中...
本篇内容介绍了“SQL注入的知识点有哪些”的有关知识,在实际...
1. mssql权限sa权限:数据库操作,文件管理,命令执行,注册...
sql执行计划如何查看?在SPL庞大的数据中我们不知道如何查看...