为什么 JPQL 只能修改查询 return void 或 int?
Why can JPQLs modifying queries only return void or int?
当我想通过 JPQL 修改数据库时,我必须将查询标记为 Transactional
和 Modiyfing
。如果我这样做,表示查询的方法的 return 类型必须是 void
或 int
(代表我认为的编辑行数)。为什么只允许 return 两种类型?如果我执行 HTTP-PUT 请求并使用自己的 JPQL 查询更新对象,我想再次 return 更新的对象。如果查询的 return 类型必须是 void
或 int
,最好的方法是什么?我是否必须再次执行单独的 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.
当我想通过 JPQL 修改数据库时,我必须将查询标记为 Transactional
和 Modiyfing
。如果我这样做,表示查询的方法的 return 类型必须是 void
或 int
(代表我认为的编辑行数)。为什么只允许 return 两种类型?如果我执行 HTTP-PUT 请求并使用自己的 JPQL 查询更新对象,我想再次 return 更新的对象。如果查询的 return 类型必须是 void
或 int
,最好的方法是什么?我是否必须再次执行单独的 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.