如何告诉Springdata存储库的删除方法,如果实体不存在,则不会引发异常?

2022-09-01 03:12:07

我正在使用SpringData的存储库。如果我尝试通过不存在或从未存在的ID删除实体,则会引发异常。由于我不想在删除实体之前检查该实体是否存在,因此它会以静默方式失败会很好。这将使它变得更容易,因为可观察的行为是相同的 - 调用后实体不再存在。无论它是否被删除或从未存在过,我都不在乎。

有没有办法修改 的默认行为,以便在实体未存在时不会引发异常?delete(EntityId)

SpringData删除的文档说,如果实体不存在,它将引发异常。


答案 1

更新的答案(投反对票后)

我最初的答案(如下)实际上是错误的:我对这个问题的理解也受到官方JavaDoc中缺少的引用的影响(正如Adrian Baker在他的评论中报道的那样)。EmptyResultDataAccessException

因此,这个问题的更好解决方案可能是Yamashiro Rion提出的解决方案。

if (repository.existsById(entityId)) {
    repository.deleteById(entityId);
}

或这个(没有,但可能表现更差):if

repository.findById(entityId)
    .map(repository::delete)

原始(错误)答案

JavaDocs 表示,如果提供的参数 (id, entity, ) 为 null,则将抛出 an,如果实体未退出,则不会抛出 。IllegalArgumentExceptionIterable<T>

如果需要避免,可以实现自定义删除方法,该方法检查:IllegalArgumentExceptionid != null

public void customDelete(ID id) {
    if(id != null){
        this.delete(id);
    }
}

如果您不知道如何添加“Spring Data 存储库的自定义实现”,请查看此文档部分


答案 2

需要较少代码的可行解决方案是向存储库接口添加一个新方法,如下所示:

// @Modifying is necessary depending on your version of Spring
@Modifying
@Query(nativeQuery=true, value="DELETE FROM MY_TABLE WHERE ID = ?1")
public void deleteById(IdPrimitiveType id);`

-->测试,如果这可以与JPQL而不是本机SQL一起使用,以允许比默认id类型更复杂的id类型(int,long,String,...)


推荐