deleteAllInBatch()和deleteAll()有什么区别?

时间:2019-10-04 07:17:13

标签: hibernate spring-boot jpa

我是冬眠和弹簧靴的新手。最近,我被分配了一个创建关系型Crud应用程序的任务。问题在于我正在关注的教程正在使用JPARepository,而我正在处理的代码中的先前工作正在使用CRUDRepository。

我的问题是,我可以使用crudRepository deleteAll()函数代替JPARepository的方法deleteAllInBatch()吗?另外,两个界面有何不同?

由于查询,我没有找到任何有用的在线文档。

1 个答案:

答案 0 :(得分:1)

简短的回答是,可以使用deleteAll代替deleteAllInBatch。但是您需要知道这些功能的实现是非常不同的。   deleteAllInBatch通过使用一个删除查询来完成其工作。

@Transactional
public void deleteAllInBatch() {
    em.createQuery(getDeleteAllQueryString()).executeUpdate();
}
private String getDeleteAllQueryString() {
    return getQueryString(DELETE_ALL_QUERY_STRING, entityInformation.getEntityName());
}
public static final String DELETE_ALL_QUERY_STRING = "delete from %s x";

另一方面,deleteAll()会导致findAll,然后我们将遍历所有实体并为每个实体调用delete。

@Transactional
public void deleteAll() {

    for (T element : findAll()) {
        delete(element);
    }
}

我们可以看到deleteAll导致N + 1个请求,其中N是目标表的总大小。