15

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

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

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

直截了当...我有遗留代码(使用休眠 4.3.11),它正在使用临时表从多个表中批量删除。在这些表中可能有 1000 行,但也可能有 1000 万行。所以只是为了确保我不会用一些疯狂的删除来杀死数据库,我创建了一个临时表,我一次放置(使用带有某些条件的选择查询)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)但这要慢得多,因为我必须为每次删除多次运行选择查询,并且limitHQL 中的嵌套选择不支持。

任何想法或指示?

谢谢。

4

1 回答 1

4

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

引用这个:

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

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

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

于 2017-12-12T14:09:09.587 回答