为什么 JPQL 只能修改查询 return void 或 int?

Why can JPQLs modifying queries only return void or int?

当我想通过 JPQL 修改数据库时,我必须将查询标记为 TransactionalModiyfing。如果我这样做,表示查询的方法的 return 类型必须是 voidint(代表我认为的编辑行数)。为什么只允许 return 两种类型?如果我执行 HTTP-PUT 请求并使用自己的 JPQL 查询更新对象,我想再次 return 更新的对象。如果查询的 return 类型必须是 voidint,最好的方法是什么?我是否必须再次执行单独的 query/request 来选择更新后的对象?

编辑:

这就是我调用查询的方式:

if (inactivityListDTO.getProjectIds().size() > 0) {
  projectRepository.updateProjectsIsArchivedByProjectIds(inactivityListDTO.getProjectIds(), inactivityListDTO.getIsArchived());
}

这就是查询:

@Transactional
@Modifying
@Query("UPDATE Project project SET project.isArchived = :isArchived, 
       project.archivedDate = current_date " +
       "WHERE project.id IN :ids")
void updateProjectsIsArchivedByProjectIds(@Param("ids") List<Long> ids, @Param("isArchived") boolean isArchived);

因为它最终归结为在数据库中执行标准 UPDATE SQL,而标准 SQL 中的 UPDATE 仅 returns正在更新的记录数,而不是 return 个结果集。

是的,如果您需要在更新后获取记录的值,则必须再次查询。或者,您应该考虑使用 JPA 方式来更新记录,它首先查询对象,然后通过更改其状态来更新它。如下所示 (假设您使用 spring @Transactional 来管理事务边界)

@Transactional
public void changeEmployeeSalary(Integer employeeId , Integer salary){
    Employee employee = entityManager.find(Employee.class , employeeId);
    employee.setSalary(salary);
}

这样记录更新后不需要再次查询,也不需要手动写UPDATE SQL.