How to I tell a Springdata-repository's delete method to not throw an exception if an entity does not exists?
Updated Answer (after downvotes)
My original answer (below) is actually wrong: my understanding of the question was influenced also by the missing reference to the EmptyResultDataAccessException
in the official JavaDoc (as reported by Adrian Baker in his comment).
So a better solution to this issue could be the one suggested by Yamashiro Rion
if (repository.existsById(entityId)) {
repository.deleteById(entityId);
}
or this one (without the if
, but probably worse performing):
repository.findById(entityId)
.map(repository::delete)
Original (Wrong) Answer
JavaDocs says that an IllegalArgumentException
will be thrown if the provided argument (id, entity, Iterable<T>
) is null and not if entity does not exsits.
If you need to avoid the IllegalArgumentException
you could implement a custom delete method that checks id != null
:
public void customDelete(ID id) {
if(id != null){
this.delete(id);
}
}
Take a look to this docs section if you don't know how to add "Custom implementations for Spring Data repositories"
A viable solution that requires less code is to add a new method to the repository interface like this:
// @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);`
--> to be tested if this can used with JPQL instead of native SQL to allow more complex id types than the default ones (int, long, String, ...)
With JpaRepository
you can easily delete an entity if it exists. In this example PostsRepository
extends JpaRepository
:
if (postsRepository.existsById(postId)) {
postsRepository.deleteById(postId);
}