【发布时间】:2020-01-05 00:03:36
【问题描述】:
在控制器层中,我得到两个参数id 的Strategy 实体和新的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)
update与POST/PUT是多余的。 (2) 调用者可以方便地使这个方法返回ResponseEntity<Strategy>和更新后的值。 (3) 使用@PathVariable("id") Strategy strategy简化控制器; Spring Data 会自动解析。 -
你用的是什么数据库?
-
@Deadpool postrges
-
@chrylis -on strike- 是的,但这不是魔术,而是查询。
标签: java spring-data hql