無効な SQL を生成する Hibernate に問題があります。具体的には、暗黙的結合と明示的結合の混合と一致。これは未解決のバグのようです。
ただし、これが無効な 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」。
質問
- この構文が無効なのはなぜですか?
- おまけ: Hibernate に明示的な JOIN のみを使用させる方法はありますか?