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

为什么hibernate在删除时生成交叉联接?

曹经业
2023-03-14

我将PostgreSQL 9.6与Hibernate 5.2.10一起使用,并且有3个实体:

@Entity  
@Table(name = "entity1")
public class Entity1 {
    @Id
    private long id;

    @ManyToOne
    @JoinColumn(name = "entity2_id")
    private Table2 table2;
}

@Entity  
@Table(name = "entity2")  
public class Entity2 {
    @Id
    private long id;

    @ManyToOne
    @JoinColumn(name = "entity3_id")
    private Table3 table3;
}

@Entity  
@Table(name = "entity3")  
public class Entity3 {
    @Id
    private long id;
}

当Entity1加入Entity2通过Entity3过滤时,我需要删除Entity1的所有出现,如下所示:

em.createQuery("delete from Entity1 e where e.entity2.entity3 = :entity3")
delete from entity1 cross join entity2 entity2_ where entity3_id=?

PS:在数据库中,所有的表都有外键。

共有1个答案

田向荣
2023-03-14

现在我发现在delete查询中不可能使用联接(实际上是从EclipseLink迁移到Hibernate,在EclipseLink上它可以工作,只是在Hibernate上不可以)。
MySQL交叉联接查询中的Hibernate异常

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

  • 我有一个地址模型,它适用于我系统中的所有模型,如下所示: 在OnModelCreating中: 它的工作非常好!我唯一的问题是关于级联删除。如何设置此方案: 删除某人时,级联删除PersonalAddress和Addresses 删除地址时,级联删除PersonalAddress而不是Person 目前我看到删除Person会删除Person地址(但不会删除相关地址)。 我并不是在抱怨这种行为,但

  • 问题内容: 使用CROSS APPLY的主要目的是什么? 我已经读过(模糊地通过Internet上的帖子),cross apply如果您要进行分区,则在选择大型数据集时可能会更有效率。(想起分页) 我也知道,CROSS APPLY不需要UDF作为右表。 在大多数INNER JOIN查询(一对多关系)中,我可以将它们重写为use CROSS APPLY,但它们始终会为我提供等效的执行计划。 任何人都

  • 问题内容: 我一直在尝试查找有关我的查询的问题。该查询实际上是由HQL的hibernate生成的,但是生成的SQL并没有达到我的期望。稍微修改SQL会产生正确的结果,但是我不确定为什么修改会有所不同。 原始查询(不返回任何行) 修改的查询-用逗号替换交叉联接(隐式交叉联接) 返回一行 我的理解可能是错误的,因为写作与Writing相同。所以我不明白为什么查询返回不同的结果。 与导致此问题的第一个查

  • 问题内容: 我对级联=“删除”的工作方式感到困惑。我在“城市”映射文件中以以下方式定义了映射: 类客户具有类城市的外键。 因此,当我运行时: 是否还应该删除所有客户端,还是必须以某种方式处理它?我是否将查询作为方法参数正确传递给会话的delete()方法?谢谢你的帮助。最好的问候,混蛋。 问题答案: 我对cascade =“ delete”的工作方式有些困惑(…) 级联操作意味着,如果您是父母,则

  • 我试图通过联接表的一个外键级联删除联接表中的行,它有另一个与之相关的表,我也想删除与此ID相关的所有行。看起来像下图。当我使用会话时。使用hibernate删除(reqCandObject)它工作正常,并通过从候选jobReq表中删除一个条目以及相关注释进行级联。但是,我想删除所有具有特定候选ID的候选项(并删除注释)。我尝试了下面的函数,但与nice hibernate不同。删除(对象)函数,此