首页 > 解决方案 > 如果 WHERE 得到空结果,则抛出 UPDATE 查询异常

问题描述

在控制器层内,我得到两个参数identityStrategy和 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实现?

标签: javaspring-datahql

解决方案


代替

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则可以抛出一个。


推荐阅读