我希望能够在EclipseLink和amp;之间交换我的JPA实现。 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实现?
答案 0 :(得分:0)
好吧,似乎JPA 1.0不支持nested joins。从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提供程序可能支持嵌套连接,但行为不是标准化的。