【问题标题】:JPQL / HQL fetch join syntax for compatibility with EclipseLink & HibernateJPQL / HQL 获取连接语法以兼容 EclipseLink 和 Hibernate
【发布时间】:2011-03-30 08:46:36
【问题描述】:

我希望能够通过简单的属性更改在 EclipseLink 和 Hibernate 之间交换我的 JPA 实现。我可以做到这一点,但导致我出现问题的是命名查询验证。使用 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 级别使用查询提示来执行 fetch join,但是有没有一种方法可以让两个 JPA 实现都使用特定的 fetch join 语法?

【问题讨论】:

  • 您使用的是什么版本的 Hibernate 和 EclipseLink?对我来说,第一个查询在 Hibernate EM 3.4.0.GA 上运行良好。
  • 抱歉,查询中缺少一行。我已通过编辑进行了更正。我正在使用 hibernate-entitymanager 的 3.5.1-Final 版本

标签: hibernate jpa eclipselink jpql fetch


【解决方案1】:

好吧,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 维基书

【讨论】:

    猜你喜欢
    • 2012-11-17
    • 2011-01-20
    • 2010-09-16
    • 2011-05-13
    • 1970-01-01
    • 2015-02-16
    • 2019-01-26
    • 1970-01-01
    相关资源
    最近更新 更多