首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么修改查询的JPQL只能返回void或int?

为什么修改查询的JPQL只能返回void或int?
EN

Stack Overflow用户
提问于 2019-12-20 10:46:11
回答 1查看 798关注 0票数 0

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

编辑:

我就是这样调用查询的:

代码语言:javascript
复制
if (inactivityListDTO.getProjectIds().size() > 0) {
  projectRepository.updateProjectsIsArchivedByProjectIds(inactivityListDTO.getProjectIds(), inactivityListDTO.getIsArchived());
}

这就是查询:

代码语言:javascript
复制
@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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-20 11:18:22

因为它最终归结为在DB中执行标准的UPDATE SQL,而标准SQL中的UPDATE只返回正在更新的记录数,而不返回结果集。

是的,如果您需要在更新后获得记录的值,您必须再次查询它。或者,您应该考虑使用JPA方法更新记录,首先查询对象,然后通过更改对象的状态来更新它。

代码语言:javascript
复制
@Transactional
public void changeEmployeeSalary(Integer employeeId , Integer salary){
    Employee employee = entityManager.find(Employee.class , employeeId);
    employee.setSalary(salary);
}

这样,您不需要在记录更新后再次查询它,也不需要手动编写更新SQL。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59423950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档