【发布时间】:2018-05-12 14:58:30
【问题描述】:
我有这样的 JPA 存储库和 JPQL 查询:
@Query("SELECT c from Campaign c" +
" left join fetch c.postsList p on p.status = :postStatus" +
" left join fetch p.platform" +
" left join fetch c.campaignStatistics stat on stat.updateDate = :updateDate" +
" where c.id =:id")
Campaign findCampaignWithPosts(
@Param("id") Long id,
@Param("postStatus") PostStatus postStatus,
@Param("updateDate") LocalDate updateDate);
但它不起作用。我明白了:
org.hibernate.hql.internal.ast.QuerySyntaxException: with-clause not allowed on fetched associations; use filters
我去研究有关 JPA 2.1 规范的信息,这就是我发现的:
用于连接的连接条件来自映射的连接 列。这意味着 JPQL 用户通常不必 知道每个关系是如何连接的。在某些情况下,这是可取的 将附加条件附加到连接条件,通常在 外连接的情况。这可以通过 ON 子句来完成。开启 子句在 JPA 2.1 规范中定义,并且可以支持 一些 JPA 提供程序。 EclipseLink : Hibernate : TopLink - 支持 ON 子句。
需要注意的是,这种类型的查询对我没有任何帮助,因为在这个查询中有时我会得到 null,where 子句在连接表之后使用。
@Query("SELECT c from Campaign c" +
" left join fetch c.postsList p" +
" left join fetch p.platform" +
" left join fetch c.campaignStatistics stat" +
" where c.id =:id" +
" and p.status = :postStatus" +
" and stat.updateDate = :updateDate")
在这种情况下该怎么办?除了如何使用本机查询之外,没有其他解决方案吗?但随后几乎所有 JPQL 查询的意义都丢失了。 我使用休眠版本 5.2.12
【问题讨论】:
-
您是否检查过您的课程中的某些字段是否称为
with? -
@Luiggi Mendoza 不,类中的所有字段都不包含'with'
-
可能是说在使用
FETCH JOIN的时候不能放ON子句?但这也是 JPA 规范所说的,所以你真的很惊讶吗?ON仅允许在普通JOIN上使用 -
另外,您声称引用了 JPA 规范,但我不知道您从哪里得到该文本;它不是来自 JPA 规范。 github.com/javaee/jpa-spec/blob/master/jsr338-MR/…
-
@DN1 我在 wikibooks link 上获得了此信息。可能没有正确表达,调用规范。但是在这种情况下怎么办?使用原生查询?
标签: java hibernate jpa join jpql