【问题标题】:How can I make sql generated by Hibernate use in operators over equality operators如何使 Hibernate 生成的 sql 在运算符中使用而不是相等运算符
【发布时间】:2022-01-13 12:00:57
【问题描述】:

我想要的是一种让 Hibernate 生成 1 条语句来删除所有子节点的方法,而不是每个子节点 1 条语句。

如果我在实体 A 和 B 之间有关系,其中 A 是父级, B 可以是多个子级。 如果我在实体关系上使用 OrphanRemoval 或 OnCascade delete 等注释,当我删除父级时,自动生成的 sql 会说

delete from table where id=?  - per child

我希望 Hibernate 做的是生成类似的 sql

delete from table where id in (child1,child1)

是否有注释或设置可以让我轻松做到这一点?

我觉得我不是第一个遇到这个问题的人,但是除了编写自己的 sql 并删除注释之外,我找不到任何解决方法。

【问题讨论】:

    标签: java hibernate jpa orm hibernate-jpa


    【解决方案1】:

    entityManager.remove() 无法做到这一点,但您可以使用 executeUpdate()

    Query q = entitiyManager.createQuery("delete from MyEntity m where m.id in :ids)");
    q.setParameter("id", <list of ids>);
    q.executeUpdate();
    

    在文档中阅读更多信息:https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#batch-bulk-hql-update-delete

    【讨论】:

    • 这看起来像是在执行我写的一个sql,但这是否考虑到了我上面的父子场景?
    • 是的。这不是 SQL,这是 JPQL,在实体模型上运行。我更改了答案以更好地反映这一点
    • 此查询正在使用“in”删除我假设这意味着此查询是删除子对象并且我必须手动调用它。但我在示例中的内容是 removeOrphan 例如或我可以使用 cascade.delete 注释,当我删除我的父对象时,我希望为该子关系创建的 sql hibernate 只为所有子关系执行 1 个查询。
    • 你试过了吗?
    猜你喜欢
    • 2020-08-12
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多