java - 如果 WHERE 得到空结果,则抛出 UPDATE 查询异常
问题描述
在控制器层内,我得到两个参数id
entityStrategy
和 newstatus
用于更新。
@PostMapping("/{id}/status/update")
public ResponseEntity<Long> updateStatus(@PathVariable(name = "id") Long id,
@NotNull @RequestBody Map<String, String> status) {
我需要验证id
,如果Strategy
不存在则向客户端抛出异常。
存储库中的方法:
@Modifying
@Query("UPDATE Strategy s SET s.status =:status WHERE s.id = :id")
void updateStatusById(@NotNull Long id, @NotNull String status);
显而易见的解决方案是使用findById(ID id)
,JpaRepository
但这会给数据库带来额外的查询。作为中期解决方案,我可以将单个事务用于两个查询,如下所示:
在StrategyService
:
@Transactional
public void update(@NotNull Long id, @NotNull String status) {
strategyRepository.findById(id).orElseThrow();
updateStatusById(id, status);
}
这个单一的交易,但仍然有几个查询。由于调用非常频繁,因此保持此查询的高速非常重要。如何在不添加查询的情况下Exception
直接抛出?updateStatusById
也许以某种方式修改 HQL 查询或使用本机 SQL 或添加default
实现?
解决方案
代替
void updateStatusById(@NotNull Long id, @NotNull String status);
可以将方法定义为
int updateStatusById(@NotNull Long id, @NotNull String status);
在这种情况下,返回值是数据库中更新的实体/行数。这是一个JDBC 特性,并包含在 Spring 中。
现在,在执行查询后(int updated = updateStatusById(id, status);
),可以检查更新了多少实体。如果0
元素已更新,Exception
则可以抛出一个。
推荐阅读
- excel - 独立于本地化的自定义编号(价格)格式
- hyperledger-fabric - Hyperledger Fabric v2.3 中对等点之间的交互
- mysql - 选择两个日期之间有 3 个连续条目的第一个日期
- c - write() 失败时会发生什么?
- javascript - 如何设置 VS Code 以显示 Alpine.js
- excel - 如何通过在单元格中输入文本来过滤表格?
- javascript - Angular 9 :: NgbModal 正在加载导航
- c - 我的 codewars 解决方案在 Visual Studio 中本地运行良好,但在通过 codewars 端的测试时会导致错误
- excel - 如果修订号是带有字母的字符串(带公式),我如何过滤和列出文档的最后修订
- java - 使用 JsonTypeInfo 进行序列化/反序列化