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

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

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

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

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

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

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

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

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

Благодарю.

1 ответ

Решение

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

Цитировать из этого:

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

Методы были удалены в этом коммите.

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

Другие вопросы по тегам