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);
}