【问题标题】:Why hibernate generates cross join on delete?为什么休眠会在删除时生成交叉连接?
【发布时间】:2017-09-22 20:09:51
【问题描述】:

我正在使用 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过滤所有的出现,像这样:

em.createQuery("delete from Entity1 e where e.entity2.entity3 = :entity3")

Hibernate 生成如下 SQL:

delete from entity1 cross join entity2 entity2_ where entity3_id=?

问题是 PostgreSQL 无法识别交叉连接,我没有找到任何其他方法来做到这一点(除了使用本机查询)。

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

【问题讨论】:

  • 请确保hibernate能识别PostgreSQL数据库?方言正确设置了吗?当应用程序启动时,您应该会在日志中看到它。
  • 是的,它可以识别。它默认使用 PostgreSQL94Dialect。其他查询有效,只是有些查询无效。

标签: postgresql hibernate jpa


【解决方案1】:

现在我发现无法在删除查询中使用连接(实际上 a 正在从 EclipseLink 迁移到 Hibernate,并且在 EclipseLink 上它可以工作,但在 Hibernate 上却不行)。
Hibernate Exception on MySQL Cross Join Query

【讨论】:

    猜你喜欢
    • 2012-06-03
    • 2017-01-14
    • 2011-06-18
    • 2014-10-10
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多