繁体   English   中英

Spring JpaRepostory 删除与 deleteInBatch

[英]Spring JpaRepostory delete vs deleteInBatch

Spring 中 JpaRepostory 中的delete(...)deleteInBatch(...)方法有什么区别? 第二个“删除一个 SQL 语句中的项目”,但从应用程序/数据库的角度来看,这意味着什么? 为什么存在两种具有相似结果的不同方法,何时使用一种或另一种更好?

编辑:这同样适用于deleteAll()deleteAllInBatch() ...

delete方法将在一次操作中删除您的实体。 deleteInBatch将批处理多个删除语句并将它们作为 1 个操作删除。

如果您需要大量删除操作,批量删除可能会更快。

这里的答案并不完整!

首先,让我们检查文档

void deleteInBatch(Iterable<T> entities)
Deletes the given entities in a batch which means it will create a single Query.

因此,“delete[All]InBatch”方法将使用 JPA 批量删除,例如“DELETE FROM table [WHERE ...]”。 这可能更有效,但它有一些警告:

  • 这不会调用您可能拥有的任何 JPA/Hibernate 生命周期钩子 (@PreDelete)
  • 它不会级联到其他实体
  • 您必须清除持久性上下文或假设它已失效。

这是因为 JPA 会向数据库发出批量 DELETE 语句,绕过缓存等,因此无法知道哪些实体受到影响。

查看 Hibernate 文档

Spring Data JPA 中的实际代码

虽然我在这里找不到具体的文章,但我会推荐Vlad Mihalcea写的所有内容,以便更深入地了解 JPA。

TLDR:“inBatch”方法使用批量 DELETE 语句,它可以快得多,但有一些警告 bc。 它们绕过 JPA 缓存。 您应该真正了解它们的工作原理以及何时使用它们来受益。

日志中的deleteInBatch(...)看起来像这样: DELETE FROM table_name WHERE (((((((? = id) OR (? = id)) OR (? = id)) OR (? = id)) OR (? = id)) OR (? = id)) OR (? = id))

如果要删除的数据量很大,达到 SQL Server 查询的最大大小,这可能会导致问题: SQL Server 查询的最大大小? IN条款? 有没有更好的方法

只需添加好奇的信息。

您不能在方法名称上使用“batch”创建自定义删除并等待 spring 数据解析它,例如,您不能这样做:

  void deleteByYourAttributeInBatch(Iterable<YourObject> object);

你是否需要做这样的事情:

  @Modifying
  @Transactional
  @Query("DELETE FROM YourObject qr WHERE o.yourAtribute IN (:object)")
  void deleteByYourAttributeInBatch(Iterable<YourObject> o);

也许这是 spring-data 的一个问题;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM