如何使用Hibernate临时表批量删除记录?

15

我有一个问题,这些方法去哪了?

Dialect.supportsTemporaryTables();
Dialect.generateTemporaryTableName();
Dialect.dropTemporaryTableAfterUse();
Dialect.getDropTemporaryTableString();

我尝试查看 Dialect.java 的 Git 历史记录,但没有成功。我发现类似 MultiTableBulkIdStrategy 的东西被创建了,但我找不到如何使用它的任何例子。

核心问题是...我有遗留代码(使用 hibernate 4.3.11),它使用临时表从多个表中进行批量删除。这些表中可能有1000行,也可能有1000万行。所以为了确保我不会用一些疯狂的删除方式杀死数据库,我创建了一个临时表,在其中一次性放置(使用带有某些条件的 select 查询)1000个 id,然后使用这个临时表从4个表中删除数据。它在 while 循环中运行,直到所有基于某些条件的数据都被删除。每个周期后事务都会被提交。

更加复杂的是,这段代码必须在 mysql、mariadb、oracle、postgresql、sqlserver 和 h2 上运行。

它使用上面提到的方法和本地 SQL 完成。但现在我找不到重构它的方法。

我的第一次尝试是创建类似这样的嵌套查询: delete from TABLE where id in (select id from TABLE where CONDITION limit 1000) 但这样会变得更慢,因为我必须为每个删除运行多次 select 查询,而且 HQL 不支持 limit。

有什么想法或指针吗?

谢谢。


1
如果答案是“嗯,它们只是消失了”,您是否可以更详细地描述您的用例,以便其他人可以提出解决问题的建议,可能不需要使用临时表? - Artem Novikov
1
也许这个链接对你有帮助 http://in.relation.to/2017/02/01/non-temporary-table-bulk-id-strategies/ ? - Ivan
https://github.com/grimsa/hibernate-single-table-bulk-id-strategy - K.Nicholas
1个回答

4
这些方法在版本4.3.11中存在,但在版本5.0.0中被移除了。它们被移除而不是被弃用似乎有点不寻常 - 背景在这个Jira工单上有说明。
引用自此:

从长远来看,我认为最好的方法是删除旨在支持分阶段表格的方言方法,并使MultiTableBulkIdStrategy成为一个完全独立的协议。

这些方法已在此提交中删除。

因此,似乎getDefaultMultiTableBulkIdStrategy()是这些方法的预期替代品 - 但我不完全清楚它的工作原理,因为它目前没有Javadoc。你可以尝试从源代码中解决问题...或者如果一切都失败了,也许可以联系Steve Ebersole,他实施了这个更改?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接