我正在使用SpringData的存储库。如果我尝试通过不存在或从不存在的ID删除实体,则会抛出异常。因为我不想在删除之前检查实体是否存在,所以它会以静默方式失败。它会使它变得更容易,因为可观察的行为是相同的 - 在调用之后实体不再存在。无论是删除还是从未存在,我都不在乎。
有没有办法修改user_id(0): 1
user_id(1): 3
user_id(2): 4
user_id(3): 6
的默认行为,这样如果实体不存在,它就不会抛出异常?
Documentation of SpringData's delete表示如果实体不存在,它将抛出异常。
答案 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