У меня есть вопрос. Куда пошли эти методы?
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.
Любые идеи или указатели?
Спасибо.