Как массировать удаление записей с использованием временных таблиц в Hibernate?

У меня есть вопрос. Куда пошли эти методы?

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

Я попытался просмотреть историю git для Dialect.java, но не повезло. Я обнаружил, что что-то вроде MultiTableBulkIdStrategy был создан, но я не смог найти какой-либо пример того, как его использовать.

К моменту... У меня есть устаревший код (с использованием hibernate 4.3.11), который выполняет пакетное удаление из несколько таблиц с использованием временной таблицы. В этих таблицах может быть 1000 строк, но также может 10 минут. Поэтому, чтобы убедиться, что я не убиваю DB с некоторым безумным удалением, я создаю временную таблицу, в которую я помещаю (используя select query с некоторым условием) 1000 идентификаторов сразу а затем используйте эту временную таблицу для удаления данных из 4 таблиц. Он работает во время цикла, пока все данные, основанные на некоторых условиях, не будут удалены. Транзакция совершается после каждого цикла.

Чтобы сделать его более сложным, этот код должен выполняться поверх: mysql, mariadb, oracle, postgresql, sqlserver и h2.

Это было сделано с использованием собственного SQL, с указанными выше способами. Но я не могу найти способ, как для рефакторинга.

Моя первая попытка состояла в том, чтобы создать запрос с помощью вложенного select следующим образом: delete from TABLE where id in (select id from TABLE where CONDITION limit 1000), но это медленнее, поскольку я должен запускать select query несколько раз для каждого удаления, а limit не поддерживается в вложенном select в HQL.

Любые идеи или указатели?

Спасибо.

Ответы

Ответ 1

Методы присутствовали в версия 4.3.11, но удалены в версия 5.0.0. Кажется немного необычным, что они были удалены, а не устарели - фон находится на этот билет Jira.

Чтобы процитировать из этого:

В долгосрочной перспективе я считаю, что лучший подход заключается в удалении метода Dialect предназначенный для поддержки таблицы, представленной по частям и MultiTableBulkIdStrategy - полностью автономный контракт.

Методы были удалены в this commit.

Итак, кажется, что getDefaultMultiTableBulkIdStrategy() является предполагаемой заменой для этих методов - но я не совсем понимаю, как это сделать в настоящее время нет Javadoc. Угадайте, что вы могли бы попытаться выработать его из исходного кода... или если все остальное не удается, попробуйте связаться с Стив Эберсол, который внедрил изменение?