如果 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
。
在控制器层内,我获得了 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
。