JPQL / HQL提取连接语法,以便与EclipseLink和&过冬

时间:2010-08-16 10:16:10

标签: hibernate jpa eclipselink jpql fetch

我希望能够在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实现?

1 个答案:

答案 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提供程序可能支持嵌套连接,但行为不是标准化的。

参考

  • JPA 1.0规范
    • 第4.4.5.3节“获取联接”
  • JPA Wikibook