我有一个CRUD作业。
读→检索一个对象。大多数都有一个值,但是如果输入了错误的ID,则可能没有返回值。
所以我们把它包装在一个可选对象中并返回。
创建→让我们通过。
更新→更新Read中提到的对象
删除→删除Read中提到的对象。
这里有一个ID,指定要更新或删除的对象(DB中的数据行)。
问题是我不确定这个id的对象是否存在于DB中。
我想执行更新或删除只有当有一个值与ID在数据库中。
此时我想到的方法是执行前面提到的Read方法,接收一个用Optional封装的对象,如果是,则通过orElseThrow()传递。
如果没有,我使用了引发Throw异常的方法。
但这似乎有问题。
-
查询后可选返回,仅在检查是否存在值后销毁。
-
但除此之外,我想不出一种方法来知道DB是否真的有一个值。
-
写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(...))
如果你仍然想为不存在的实体抛出异常。