如果实体不存在,如何告诉 Springdata-repository 的 delete 方法不抛出异常?

新手上路,请多包涵

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

有没有办法修改 delete(EntityId) 的默认行为,这样如果实体不存在,它就不会抛出异常?

SpringData 的 delete 文档 说,如果实体不存在,它将抛出异常。

原文由 EhmKah a.k.a. Michael Krauße 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 695
2 个回答

更新的答案(投票后)

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

所以这个问题的更好解决方案可能是 Yamashiro Rion 建议的

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

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

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


原始(错误)答案

JavaDocs 说如果提供的参数 (id, entity, IllegalArgumentException Iterable<T> ) 是 null 并且 如果实体不存在则不会 抛出 --- 。

如果你需要避免 IllegalArgumentException 你可以实现一个自定义删除方法来检查 id != null

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

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

原文由 davioooh 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 // @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 以允许比默认类型(int、long、String、…)更复杂的 id 类型

原文由 Cédric Marion 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题