У меня проблема с 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
Оба эти запроса работают. Я понимаю, что есть декартово произведение; это намеренно.
Явный JOIN:
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,
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 ошибка:
Неизвестный столбец 'e1.managerEmployeeID' в разделе "on".
Вопрос (ы)
- Почему этот синтаксис недействителен?
- Бонус: Есть ли способ заставить Hibernate использовать только явные JOINs?