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, …)

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)