【问题标题】:Throwing Exception for UPDATE query if WHERE get empty result如果 WHERE 得到空结果,则抛出 UPDATE 查询异常
【发布时间】:2020-01-05 00:03:36
【问题描述】:

在控制器层中,我得到两个参数idStrategy 实体和新的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 实现?

【问题讨论】:

  • (1) updatePOST/PUT 是多余的。 (2) 调用者可以方便地使这个方法返回ResponseEntity&lt;Strategy&gt; 和更新后的值。 (3) 使用@PathVariable("id") Strategy strategy 简化控制器; Spring Data 会自动解析。
  • 你用的是什么数据库?
  • @Deadpool postrges
  • @chrylis -on strike- 是的,但这不是魔术,而是查询。

标签: java spring-data hql


【解决方案1】:

而不是

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

可以将方法定义为

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

在这种情况下,返回值是数据库中更新的实体/行数。这是 JDBC feature 并包含在 Spring 中。

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

【讨论】:

    猜你喜欢
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多