【发布时间】:2021-08-02 03:11:33
【问题描述】:
我想在不先为每个对象进行选择的情况下进行批量删除。我没有找到使用 spring data jpa 和实体管理器的方法来执行此操作。出于这个原因,我尝试了 JDBC 模板。 但是,我遇到了可分页的问题。 此代码工作正常,所有删除均通过批处理执行。不幸的是,每个实体都有不必要的选择。
@Transactional
public void deleteFoos() {
Page<Foo> page = repository.findAll(PageRequest.of(0,50);
Pageable pageable = null;
do {
if ( pageable != null ) {
page = repository.findAll( pageable );
}
repository.deleteAll( page.getContent() );
} while ( (pageable = page.nextPageable()) != Pageable.unpaged() );
}
我现在尝试的是直接用 JDBC 模板实现整个事情。
@Transactional
public void deleteFoos() {
Page<Foo> page = repository.findAll(PageRequest.of(0,50);
Pageable pageable = null;
do {
if ( pageable != null ) {
page = repository.findAll( pageable );
}
//repository.deleteAll( page.getContent() );
jdbcTemplate.batchUpdate(
"DELETE FROM foo WHERE (id = ?)",
page.getContent(),
page.getTotalItems(),
( preparedStatement, argument ) -> {
preparedStatement.setObject( 1, argument.getId() );
} );
} while ( (pageable = page.nextPageable()) != Pageable.unpaged() );
}
但是,第三页和第四页始终是空的。似乎删除是直接执行的。自动提交已关闭,还有什么问题?
编辑:Jens 的解决方案效果很好:“您可以简单地重复请求第一页并将其删除。”
【问题讨论】:
-
不接受以前的一个答案。
-
'看起来删除是直接执行的' - ummmmm...为什么不呢?你真的让我很困惑
-
另外,为什么你觉得你需要分页来删除数据库表中的所有内容?只需致电
DELETE FROM foo即可完成 -
好吧,删除查询仅限于 id。这也是一个演示示例,但描述了问题。不幸的是,这并不容易
-
@K.Nicholas 随时回答未决问题。这将是一个很大的帮助:)
标签: spring-data-jpa jdbctemplate spring-transactions