Как массово удалить записи, используя временные таблицы в 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, который осуществил изменение?