如何在休眠中使用临时表批量删除记录?

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

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

我试图浏览git历史记录,但没有运气。我发现创建了类似的东西,但我找不到任何如何使用它的例子。Dialect.javaMultiTableBulkIdStrategy

切中要害...我有遗留代码(使用hibernate 4.3.11),它使用临时表从多个表中进行批量删除。在这些表中,可能有 1000 行,但也可能有 1000 万行。因此,为了确保我不会通过一些疯狂的删除来杀死DB,我创建了临时表,其中我一次放置(使用具有某些条件的选择查询)1000个ID,然后使用此临时表从4个表中删除数据。它在循环时运行,直到基于某些条件的所有数据都未被删除。事务在每个周期后提交。

为了使它更加复杂,这段代码必须在以下代码上运行:mysql,mariadb,oracle,postgresql,sqlserver和h2。

它是使用上面提到的方法使用本机SQL完成的。但不是我找不到如何重构它的方法。

我的第一次尝试是像这样使用嵌套选择创建查询:但这要慢得多,因为我必须为每次删除多次运行选择查询,并且在HQL中的嵌套选择中不受支持。delete from TABLE where id in (select id from TABLE where CONDITION limit 1000)limit

任何想法或指针?

谢谢。


答案 1

这些方法存在于版本 4.3.11 中,但在版本 5.0.0 中已删除。它们被删除而不是被弃用似乎有点不寻常 - 背景在这个Jira票上

引用如下:

从长远来看,我认为最好的方法是删除Diaphras方法,该方法旨在支持以零碎的方式表,并使MultiTableBulkIdStrategy成为一个完全独立的合同。

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

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


答案 2

推荐