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

spring数据rest更新产生交叉连接sql错误

利稳
2023-03-14

我想使用spring data rest来更新某个用户的行,但是在运行时这个查询有奇怪的“交叉连接”添加到查询中。

Spring数据休止法

 @Modifying
@Transactional
@Query("Update Notification n SET n.noticed = true Where n.notificationPost.owner.userId = 1 ")
public void postNoticed();

运行时创建的查询

Hibernate: update notification cross join  set noticed=true where owner_id=?

我唯一关心的是为什么要添加“交叉连接”,因为它会导致sql错误

org.postgresql.util.PSQLException: ERROR: syntax error at or near "cross"

我通过rest调用直接调用这个方法,也通过mvc控制器调用这个方法,这两种方法都会产生相同的错误

共有1个答案

郭翰墨
2023-03-14

找到了http://forum.spring.io/forum/spring-projects/data/114271-spring-data-jpa-modifying-query-failure中所述的解决方案

“在大容量HQL查询中不能指定隐式或显式联接。子查询可以在where子句中使用,其中子查询本身可能包含联接。”(Hibernate文档引用:http://docs.jboss.org/Hibernate/core.../#batch-direct)。“

所以我编辑了我的代码来使用子查询

@Modifying
@Transactional
@Query("Update Notification n SET n.noticed = true Where n.notificationPost.postId in (SELECT n2.notificationPost.postId FROM Notification n2  where n2.notificationPost.owner.userId =:#{#security.principal.user.userId}) ")
public int postNoticed();
 类似资料:
  • 本文向大家介绍Microsoft SQL Server 交叉连接,包括了Microsoft SQL Server 交叉连接的使用技巧和注意事项,需要的朋友参考一下 示例 A cross join是笛卡尔联接,表示两个表的笛卡尔乘积。此联接不需要任何条件即可联接两个表。左表中的每一行将连接到右表中的每一行。交叉联接的语法: 例: 结果: 请注意,还有其他方法可以应用CROSS JOIN。这是无条件的

  • 我有一个以下JPQL查询 用于转换为以下SQL查询 过去一切都是魅力。但后来我不得不升级一些依赖项版本,以匹配其他模块的依赖项。这时这个查询中断了,现在它被转换成了这个SQL。 正如你所料,这是行不通的。我得到以下错误 我试图降低多个依赖项的级别,包括hibernate和spring数据jpa相关的依赖项,但没有起到任何作用。如果有人能帮我解决这个问题,我将不胜感激。 非常感谢。

  • 主要内容:笛卡尔积前面所讲的查询语句都是针对一个表的,但是在关系型数据库中,表与表之间是有联系的,所以在实际应用中,经常使用多表查询。多表查询就是同时查询两个或两个以上的表。 在 MySQL 中,多表查询主要有交叉连接、内连接和外连接。由于篇幅有限,本节主要讲解交叉连接查询。内连接和外连接将在《 MySQL内连接》和《 MySQL外连接》中讲解。 交叉连接(CROSS JOIN)一般用来返回连接表的笛卡尔积。 本节

  • 问题内容: 我找不到关于交叉联接的任何信息,包括合并/联接或其他一些东西。我需要使用{my function}作为myfunc处理两个数据帧。相当于: 相当于: 但我需要更有效的解决方案:如果使用了应用,我将如何实现它们; ^^ 问题答案: 对于叉积,请参阅此问题。 本质上,您必须进行常规合并,但为每一行赋予相同的键以进行连接,以使每一行在框架之间相互连接。 然后可以通过应用函数将列添加到新框架:

  • 问题内容: 我正在尝试从表中的每个元素中提取所有对对,而该表是同一张表中的每个元素,这是我的查询: 我处于只需要一半记录的情况。我的天真尝试是: 但我无法在插入时查询目标表,如SQL Server所述: 我怎样才能有效地做到呢? 编辑 仅供参考,我说:“我需要一半的记录”,这是错误的,在服用后账户记录计数是 问题答案: 因此,只需对连接进行条件调整,以使左侧始终等于或小于左侧!

  • 我希望为结果提供内容过滤。我的(为简洁起见而编辑)实体如下所示: 节点: 场景: 来源: 下面是我希望实现的筛选器的一个示例。 给定一个SourceTypes集合,我希望选择所有场景,这样每个场景都会被其中一个类型的源引用。我使用QueryDSL和以下谓词实现了这一点: 一系列这些谓词被组合起来给出一个整体查询。即使只选择一个SourceType,结果查询看起来也是这样: 我相信上面发生的是交叉连