如果 WHERE 得到空结果,则为 UPDATE 查询抛出异常

Throwing Exception for UPDATE query if WHERE get empty result

在控制器层内,我获得了 Strategy 实体的两个参数 id 和用于更新的新 status

@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);
}

这单笔交易,但仍有几个查询。保持此查询的高速非常重要,因为它调用非常频繁。如何在不添加查询的情况下直接从 updateStatusById 抛出 Exception?也许以某种方式修改 HQL 查询或使用本机 SQL 或添加 default 实现?

而不是

void updateStatusById(@NotNull Long id, @NotNull String status);

可以将方法定义为

int updateStatusById(@NotNull Long id, @NotNull String status);

在这种情况下,返回值是数据库中更新的entities/rows个数。这是一个 JDBC feature 并包含在 Spring.

现在,在执行查询 (int updated = updateStatusById(id, status);) 后,可以检查更新了多少实体。如果更新了 0 个元素,则可以抛出 Exception