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