我有一个问题,这些方法去哪了?
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。
有什么想法或指针吗?
谢谢。