一尘不染

混合隐式和显式JOIN

hibernate

我在使用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”。

问题

  1. 为什么此语法无效?
  2. 奖励: 有没有办法强迫Hibernate只使用显式的JOIN?


阅读 265

收藏
2020-06-20

共1个答案

一尘不染

导致错误,因为根据SQL标准,JOIN关键字的优先级比逗号高。症结在于,表别名必须在子句中对相应表求值 才能使用FROM

因此,当您e1JOIN...ON表达式中引用时,e1尚不存在。

在我研究Hibernate时,请等待,并确定是否可以说服它JOIN在所有情况下使用。


Hibernate.org上的所有内容似乎都已重定向到jboss.org。因此,目前无法在线阅读HQL文档。我相信他们最终会弄清楚自己的名字的。

2020-06-20