【问题标题】:JPA Fetch Join Filter on List/Set列表/集上的 JPA 获取连接过滤器
【发布时间】:2011-04-04 20:53:17
【问题描述】:

我在使用 JPA (Hibernate) Fetch Join 时遇到问题:

这是我的 JPQL 查询

SELECT n FROM News n LEFT JOIN FETCH n.profiles AS pr WHERE pr.id=?1

但它不起作用。如何进行查询以过滤正在获取的列表?

【问题讨论】:

  • 你能贴出News 课程代码吗?
  • 另见:stackoverflow.com/questions/5816417/…;简短总结: - JPA 规范不允许使用别名 JOIN FETCH - 如果使用带别名的 JOIN FETCH,休眠不会抱怨 - 您可以轻松地使用带别名的 JOIN FETCH 射击自己的脚

标签: java hibernate orm jpa jpql


【解决方案1】:

根据规范,您尝试做的事情是不允许的(至少 JPA 不允许)。来自 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 n FROM News n LEFT JOIN n.profiles p WHERE p.id = ?1

但是你不能在这里使用 FETCH JOIN。

【讨论】:

    【解决方案2】:

    试试这个方法:

    SELECT n FROM News n LEFT JOIN FETCH n.profiles AS pr WITH (pr.id=?1) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-08
      • 2017-11-24
      • 1970-01-01
      • 2017-04-06
      • 2015-12-10
      • 2018-08-14
      • 2022-06-13
      • 2014-04-09
      相关资源
      最近更新 更多