Синтаксис выборки JPQL / HQL для совместимости с EclipseLink и Hibernate - PullRequest
2 голосов
/ 16 августа 2010

Я бы хотел поменять реализацию JPA между EclipseLink и Hibernate с помощью простого изменения свойства.Я могу сделать это хорошо, но то, что вызывает у меня проблемы, это проверка именованного запроса.Используя EclipseLink, я должен написать выборочные соединения следующим образом:

SELECT id 
FROM IndexDefinition id 
JOIN FETCH id.index 
JOIN id.index i
JOIN FETCH i.indexVersions

Но при проверке этого запроса с использованием Hibernate я получаю следующее исключение:

org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list 

Так что я могу изменить запрос наHQL дружественен вот так:

SELECT id 
FROM IndexDefinition id 
JOIN FETCH id.index i
JOIN FETCH i.indexVersions

Но тогда это вызывает следующее исключение в EclipseLink:

Exception Description Syntax error parsing the query [IndexDefinition.getForIndex] SELECT id FROM IndexDefinition id JOIN FETCH id.index i, syntax error at [id].
Internal Exception MismatchedTokenException(78!=-1)

Я знаю, что могу использовать подсказки запросов на уровне DAO для выполнения выборочного соединения, ноЕсть ли способ удовлетворить обе реализации JPA с помощью специального синтаксиса соединения выборки?

1 Ответ

0 голосов
/ 16 августа 2010

Что ж, похоже, вложенные объединения не поддерживаются JPA 1.0. Из спецификации JPA 1.0:

4.4.5.3 Выборка соединений

FETCH JOIN включает выборку ассоциация как побочный эффект выполнение запроса. FETCH JOIN является указано над объектом и его связанные лица.

Синтаксис для соединения извлечения:

fetch_join ::= [ LEFT [OUTER] | INNER ] JOIN FETCH join_association_path_expression

Ассоциация, на которую ссылается правая часть предложения FETCH JOIN должна быть ассоциация, которая принадлежит сущность, которая возвращается в результате запроса. Не разрешено указать идентификационную переменную для лица, на которые ссылаются по праву сторона предложения FETCH JOIN, и отсюда ссылки на неявно извлеченные объекты не могут появиться в другом месте запроса .

Следующий запрос возвращает набор ведомства. Как побочный эффект, ассоциированные сотрудники для тех отделы также извлекаются, даже хотя они не являются частью явный результат запроса. Постоянный поля или свойства сотрудников которые охотно доставлены полностью инициализируется. Инициализация свойства отношения сотрудники, которые извлекаются определяется метаданными для Класс сущности сотрудника.

SELECT d
FROM Department d LEFT JOIN FETCH d.employees
WHERE d.deptno = 1

Соединение извлечения имеет такое же соединение семантика как соответствующий внутренний или внешнее соединение, за исключением того, что связанный объекты, указанные справа сторона операции соединения не возвращается в результате запроса или иначе упоминается в запросе. Отсюда, например, если отдел 1 имеет пять сотрудников, вышеуказанный запрос возвращает пять ссылок на отдел 1 сущ.

Итак, хотя некоторые поставщики JPA могут поддерживать вложенные объединения, поведение не стандартизировано.

Ссылки

...