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

How to bulk delete records using temporary tables in Hibernate?

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

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

我尝试浏览 git 历史记录 Dialect.java,但没有成功。我发现类似的东西 MultiTableBulkIdStrategy 已创建,但我找不到任何有关如何使用它的示例。

至此...我有遗留代码(使用休眠 4.3.11)正在从中批量删除 使用临时 table 的多个 table。在那些 table 中可能有 1000 行,但也可能有 是 1000 万行。因此,为了确保我不会用一些疯狂的删除来杀死数据库,我创建了 temp table 我放置的地方(在某些条件下使用 select 查询)一次 1000 个 ID 然后使用此临时 table 从 4 table 中删除数据。它在 while 循环中 运行ning 直到所有基于某种条件的数据都没有被删除。 事务在每个周期后提交。

为了使其更复杂,此代码必须 运行 在以下基础之上:mysql、mariadb、oracle、postgresql、sqlserver 和 h2。

它是使用本机 SQL 完成的,方法如上所述。但不是我找不到办法 重构它。

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

有什么想法或建议吗?

谢谢。

这些方法出现在 version 4.3.11 but removed in version 5.0.0. It seems a bit unusual that they were removed rather than deprecated - the background is on this Jira ticket

引用自此:

Long term, I think the best approach is to remove the Dialect method intended to support table tabled in a piecemeal fashion and to make MultiTableBulkIdStrategy be a fully self-contained contract.

方法已在 this commit 中删除。

看来 getDefaultMultiTableBulkIdStrategy() is the intended replacement for these methods - but I'm not entirely clear on how, as it currently has no Javadoc. Guess you could try to work it out from the source code ...or if all else fails, perhaps try to contact Steve Ebersole 是谁实施了更改?