질문이 있습니다. 이 방법들은 어디로 갔습니까?Hibernate에서 임시 테이블을 사용하여 레코드를 대량으로 삭제하는 방법은 무엇입니까?
Dialect.supportsTemporaryTables();
Dialect.generateTemporaryTableName();
Dialect.dropTemporaryTableAfterUse();
Dialect.getDropTemporaryTableString();
나는 Dialect.java
에 대한 자식의 역사를 찾아 시도,하지만 운했습니다. MultiTableBulkIdStrategy
과 같은 것을 발견했지만 사용법에 대한 예제를 찾을 수 없습니다.
하려면 ... 임시 테이블을 사용하여 일괄 삭제를 수행하는 레거시 코드 (최대 절전 모드 4.3.11 사용)가 있습니다. 이 테이블에는 1000 개의 행이있을 수 있지만, 은 10 밀리 행이 될 수 있습니다. 그래서 나는 단지 미친 삭제와 DB를 죽이지 않는지 내가 임시 테이블을 작성 (일부 조건을 사용하여 select 쿼리 사용) 1000 ID를 누른 다음이 임시 테이블을 사용하여 4 테이블에서 데이터를 삭제합니다. 일부 조건을 기반으로하는 모든 데이터가 삭제되지 않을 때까지 주기적으로 실행됩니다. 트랜잭션은 매주기마다 커밋됩니다.
이 코드는 mysql, mariadb, oracle, postgresql, sqlserver 및 h2 위에 실행해야합니다.
위에서 언급 한 방법으로 원시 SQL을 사용하여 수행되었습니다. 하지만 리팩터링하는 방법을 찾을 수 없습니다. .
내 첫 번째 시도가 쿼리를 만드는 것이었다하면이 같은 선택 중첩 사용 : delete from TABLE where id in (select id from TABLE where CONDITION limit 1000)
하지만 각 삭제하고 limit
은 HQL에서 중첩 된 선택에서 지원되지 않습니다에 대한 선택 쿼리를 여러 번 실행해야으로이 방법이 느립니다.
아이디어 나 지침이 있으십니까?
감사합니다.
답변이 '잘 되었어요'라고 말하면 다른 사람이 임시 테이블없이 문제의 해결 방법에 대한 제안을 할 수 있도록 귀하의 유스 케이스를 자세히 설명해 주시겠습니까? –
아마도이 정보는 http://in.relation.to/2017/02/01/non-temporary-table-bulk-id-strategies/에 도움이됩니까? – Ivan
https://github.com/grimsa/hibernate-single-table-bulk-id-strategy –