当前位置: 首页 > 知识库问答 >
问题:

JPQL查询-Hibernate:提取的关联不允许WITH-子句

彭正谊
2023-03-14
@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

我去研究了关于JPA2.1规范的信息,这就是我发现的:

用于联接的联接条件来自映射的联接列。这意味着JPQL用户通常不必知道每个关系是如何连接的。在某些情况下,需要在连接条件中附加附加条件,通常是在外部连接的情况下。这可以通过ON子句来实现。ON子句在JPA2.1规范中定义,某些JPA提供程序可能支持ON子句。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查询的意义都丢失了。我使用hibernate版本5.2.12

共有1个答案

苏富
2023-03-14

您是对的,当您添加p.status=:poststatus时,它会过滤掉连接右侧不存在的结果(即当活动没有posts时)。

对我起作用的是添加一个OR子句来接受连接的右侧为null的情况。

因此,您应该将和p.status=:poststatus替换为和(p为NULL或p.status=:poststatus)

因此此请求应该起作用:

@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 is NULL OR p.status = :postStatus)" +
            " and stat.updateDate = :updateDate")

至于您收到的错误消息,我认为您不应该添加on子句,因为那已经由JPA/Hibernate处理了。

我使用的是Hibernate 5.0.12。

 类似资料:
  • 问题内容: 我在MS Access中有如下查询 我已将其放入报告中,现在当尝试查看报告时,它会显示警报“ 子查询中不允许使用多级GROUP BY子句 ” 我没有得到的是查询中什至没有任何GROUP BY子句,所以为什么返回此错误? 问题答案: 来自Allen Browne出色的Access技巧网站:生存子查询 错误:“不允许多级分组” 您花了半个小时用子查询来构建查询,并验证它是否可以正常工作。您

  • 我正在尝试使用JPA查询使用以下查询从DB中获取数据: 其中,id=candidate_id(主表的主键)。 该查询也从其所有关联表中获取数据,而我的要求是仅从其2个关联表中获取数据。因为第三个表包含大量JSON数据,这会降低上述查询的响应时间。 我尝试使用JOIN,获取父级的JOIN及其2个关联表,但它不起作用。我还在研究如何在获取候选数据时只跳过一列数据(带有大量JSON的第3个表的列),但运

  • 问题内容: 是否有任何原因为什么或为什么不应该在子查询中执行“排序依据”? 问题答案: 是:不应这样做,因为从概念上讲这没有意义。 子查询将在某些外部查询中使用(否则它将毫无意义),并且该外部查询无论如何都必须进行排序,因此对子查询进行排序没有任何意义。 这是因为除非使用显式ORDER,否则SQL中的查询结果将没有特定的顺序。因此,即使您在子查询中使用了ORDER,也无法保证这会影响外部查询的结果

  • 问题内容: 我在PHP中运行一个脚本,该脚本uisng循环为MySQL创建了一个字符串查询。 执行脚本后,出现以下错误: “您的SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册,以在’UPDATE BANNERS SET pos = 1 WHERE BID = 5; UPDATE BANNERS SET pos = 2 WHERE BID = 1’附近使用正确的语法。在第2行 在错误

  • 我通过一个实体(因为关联有一个附加字段),在线程和参与者之间有一个多对多的关系。我有以下映射。 线程实体 参与实体 线程参与者实体 ThreadParticipantPK 现在,我尝试使用以下查询(使用Spring数据JPA)获取线程,并将Hibernate作为我的JPA提供者。 问题是,当中的关联的获取类型设置为,