当我想通过JPQL修改数据库时,我必须将查询标记为Transactional和Modiyfing。如果这样做,表示查询的方法的返回类型必须是void或int(表示我认为已编辑的行数)。为什么只允许这两种返回类型?如果我执行HTTP-PUT请求并使用自己的JPQL查询更新对象,我想再次返回更新的对象。如果查询的返回类型必须是void或int,那么最好的方法是什么?是否必须再次执行单独的查询/请求,在对象更新后选择对象?
编辑:
我就是这样调用查询的:
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);发布于 2019-12-20 11:18:22
因为它最终归结为在DB中执行标准的UPDATE SQL,而标准SQL中的UPDATE只返回正在更新的记录数,而不返回结果集。
是的,如果您需要在更新后获得记录的值,您必须再次查询它。或者,您应该考虑使用JPA方法更新记录,首先查询对象,然后通过更改对象的状态来更新它。
@Transactional
public void changeEmployeeSalary(Integer employeeId , Integer salary){
Employee employee = entityManager.find(Employee.class , employeeId);
employee.setSalary(salary);
}这样,您不需要在记录更新后再次查询它,也不需要手动编写更新SQL。
https://stackoverflow.com/questions/59423950
复制相似问题