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

时间:2017-12-08 11:49:49

标签: java spring hibernate temp-tables bulk-delete

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

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

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

到目前为止......我有遗留代码(使用hibernate 4.3.11),它正在进行批量删除 使用临时表的多个表。在那些表中可能有1000行,但也可能有 是10万行。所以只是为了确保我不会通过一些疯狂的删除来杀死数据库我创建了临时表,我放置了(使用具有某些条件的选择查询)一次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 个答案:

答案 0 :(得分:4)

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

引用这个:

  

长期来看,我认为最好的方法是删除Dialect方法   打算以零碎的方式支持表格并制作   MultiTableBulkIdStrategy是一个完全独立的合同。

这些方法已在this commit中删除。

所以似乎getDefaultMultiTableBulkIdStrategy()是这些方法的预期替代品 - 但我并不完全清楚如何,因为它目前没有Javadoc。猜猜你可以尝试从the source code开始......或者如果其他所有方法都失败了,或者尝试联系Steve Ebersole,谁实施了这项变更?