如何通过Spring Data JPA的@Query注解更新实体内部的关联对象
结论
你要实现的操作完全可行,你写的写法核心逻辑没有问题,只需要修正几个小细节即可正常运行。
语法修正
你给出的JPQL写法存在一个语法错误:参数占位符:和参数名之间不能有空格,修改后的正确写法如下:
@Modifying @Query("update Person p set p.address = :address") void update(@Param(value = "address") Address address)
注意事项
- 上面的写法没有加
where条件,执行后会修改所有Person记录的address关联,实际使用时必须根据业务场景补充过滤条件,比如按指定Person的id更新:@Modifying @Query("update Person p set p.address = :address where p.id = :personId") void update(@Param("address") Address address, @Param("personId") Long personId); - 传入的
Address参数必须是已经持久化的实体(即数据库中存在对应id的记录),不能是未保存的瞬态对象,否则JPA会抛出关联实体未持久化的异常。 @Modifying注解的更新操作默认不会刷新JPA上下文的一级缓存,如果你更新后需要立即获取对应Person的最新状态,可以按需配置注解参数:// 执行更新后自动清空上下文缓存,后续查询会从数据库拉取最新数据 @Modifying(clearAutomatically = true)
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

