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

时间:2016-08-05 09:17:14

标签: java spring spring-data

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

有没有办法修改user_id(0): 1 user_id(1): 3 user_id(2): 4 user_id(3): 6 的默认行为,这样如果实体不存在,它就不会抛出异常?

Documentation of SpringData's delete表示如果实体不存在,它将抛出异常。

9 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

您可以使用deleteById方法,如果该实体不存在,该方法不会引发异常。

void deleteById(ID id)
      Deletes the entity with the given id.
Parameters:
      id - must not be null.
Throws:
      IllegalArgumentException - in case the given id is null

答案 2 :(得分:1)

在您的存储库中,您应定义返回类型为 Integer 的方法:

Integer deleteMyEntityById(Long id);

如果要删除的实体不存在,如果实体已被删除,您的方法将返回 0 或 1。

答案 3 :(得分:0)

覆盖方法:

@Transactional
@Override
    public void delete(ID id) {
        T entity = findOne(id);
        if (entity == null) {
          //do something instead of throwing exception ex:
          //syso entity does not exist ; return;
        }
        em.remove(em.merge(entity));
    }

答案 4 :(得分:0)

我使用@SQLDelete批注覆盖默认的Hibernate DELETE方法并抑制抛出异常:

@javax.persistence.Entity
@Table(name = "mytable")
@Proxy(lazy = false)
@SQLDelete(
        sql =
        "DELETE FROM mytable " +
        "WHERE my_id = ?"
)
public class MyTable {
  @javax.persistence.Column(name = "my_id", nullable = false)
  @Id
  private Long id;
...
}

然后休眠将自动替换为'?'在准备好的带有MyTable对象的实际ID的语句中,该语句映射到表的SQL字段'my_id'

在这种情况下,如果表中的记录不存在,则不会引发任何异常,仅以静默方式删除0行,就像在普通SQL DELETE查询中一样

答案 5 :(得分:0)

使用JpaRepository,您可以轻松删除实体(如果存在)。在此示例中,PostsRepository扩展了JpaRepository

if (postsRepository.existsById(postId)) {
    postsRepository.deleteById(postId);
}

答案 6 :(得分:0)

如果没有找到实体,我使用了波纹管方法引发有意义的异常。

if (postsRepository.existsById(postId)) {
    throw new EntityNotFoundExceptionById("Invlaid Id was provided");
}

postsRepository.deleteById(postId);

EntityNotFoundExceptionById类

@ResponseStatus(HttpStatus.NOT_FOUND)
public class EntityNotFoundExceptionById extends RuntimeException {

    public EntityNotFoundExceptionById(String message) {
        super(message);
    }

}

答案 7 :(得分:0)

如果您只需要删除一个ID,就可以这样做。

if(repsoitory.existsById(id)){ 
   repository.deleteById(id)
}

如果您有要删除的ID列表,则可以使用Java 8

 List<Long> ids=new ArrayList<>();
  ids.stream().filter(id->repository.existsById(id))
              .forEach(id->repository.deleteById(id));

答案 8 :(得分:-1)

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

如果您需要避开IllegalArgumentException,则可以实施检查id != null的自定义删除方法:

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

如果您不知道如何添加“Spring Data存储库的自定义实现”,请查看this docs section