难道不反对使用可选对象进行验证吗?



我有一个CRUD作业。

读→检索一个对象。大多数都有一个值,但是如果输入了错误的ID,则可能没有返回值。

所以我们把它包装在一个可选对象中并返回。

创建→让我们通过。

更新→更新Read中提到的对象

删除→删除Read中提到的对象。

这里有一个ID,指定要更新或删除的对象(DB中的数据行)。

问题是我不确定这个id的对象是否存在于DB中。

我想执行更新或删除只有当有一个值与ID在数据库中。

此时我想到的方法是执行前面提到的Read方法,接收一个用Optional封装的对象,如果是,则通过orElseThrow()传递。

如果没有,我使用了引发Throw异常的方法。

但这似乎有问题。

  1. 查询后可选返回,仅在检查是否存在值后销毁。

  2. 但除此之外,我想不出一种方法来知道DB是否真的有一个值。

  3. 写if == null不是更好吗?

下面是我实现的代码:

请建议一个好的方法。

public Optional<CallCounselEntity> getCallCounselByUserId(UUID userId, UUID counselId) {
return return callCounselRepository.findByUserId(userId, counselId);
}

public CallCounselEntity updateCallCounsel(CallCounselEntity callCounsel) {
**getCallCounselByUserId(callCounsel.getUserId(),callCounsel.getCounselId()).orElseThrow(() -> new NoSuchElementException("No Search Data"));**
callCounselRepository.save(callCounsel));
return callCounsel;
}

是什么意思"可选的被摧毁"?

你想要CallCounselEntity entity = getCallCounselByUserId(...).orElseThrow(...)。如果代码没有抛出,那么该方法将继续,entity现在被分配一个非可选值,您可以使用该值进行更新。如果代码抛出,那么,引用entity的方法中任何剩余的代码都将永远无法到达。这才是重点。

因此,总结一下,以下代码对于您的场景是完全有效的:
CallCounselEntity entity = getCallCounselByUserId(...).orElseThrow(...)
/* perform your update here */

或者,您可以使用:

getCallCounselByUserId(...).ifPresent(existingCounsel -> { 
/* perform your update here */ 
})

getCallCounselByUserId(...).ifPresentOrElse(existingCounsel -> { 
/* perform your update here */ 
}, () -> throw new RuntimeException(...))

如果你仍然想为不存在的实体抛出异常。

相关内容

  • 没有找到相关文章

最新更新