在spring data jpa中通过@Query更新Entity内部的关联对象

Posted

技术标签:

【中文标题】在spring data jpa中通过@Query更新Entity内部的关联对象【英文标题】:Update associated object inside Entity via @Query in spring data jpa 【发布时间】:2021-12-09 05:53:51 【问题描述】:

我想通过 Spring Data JPA 的 @Query 更新实体内部的关联对象。 有可能吗?

@Entity
@Getter
@Setter
public class Person
   
   @Id
   private Long id;
   
   @OneToOne
   @NotNull
   @JoinColumn(name = "address")
   private Address address;

@Entity
@Getter
@Setter
public class Address
   
   @Id
   private Long id;
   
   private String state;

我在 Internet 上看到的所有示例都指向使用 String、int、... 更新查询 我正在寻找一种方法来更新可以传递自定义关联对象的查询。

@Modifying
@Query("update Person p set p.address =: address)
void update(@Param(value = "address") Address address)

有可能吗?我也尝试过使用 JPA 的 EntityManagersave() 方法,但我正在寻找上述类型的 JPQL 查询。

【问题讨论】:

@Query("update Person p set p.address =: address) 是怎么回事?你试过了吗?当然它需要一个where 子句来缩小更新范围,否则它将更新数据库中的所有人员并且=: address 中有一个小类型,它需要是= :address 和一个结束双引号"跨度> 【参考方案1】:

以下内容将更新所有Person 实体的地址。

@Transactional
@Modifying
@Query("update Person p set p.address = :address")
void update(@Param(value = "address") Address address)

注意@Transactional 注释并确保Address address 参数不应该是瞬态的,即应该已经存在于数据库中并从那里获取它

Address address = new Address();
address.setState("blabla");
Address savedAddress = addressRepository.save(address);

personRepository.update(savedAddress); // use the peristed Address entity here.

【讨论】:

如果首先更新已经存在的地址,我们需要从数据库中获取与人员关联的特定地址,更改其状态,保存地址,然后更新人员。我已经把 cascade = CascadeType.ALL 我仍然需要先保存地址然后更新人否则我得到瞬态异常。任何方法来避免获取地址、更新和保存然后更新人员的样板代码

以上是关于在spring data jpa中通过@Query更新Entity内部的关联对象的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot中的JPA @query中没有传递参数[重复]

spring jpa 自带page @Query 出错

深入浅出学Spring Data JPA toPredicate Predicate[] p = new Predicate[list.size()]; query.where(cb.and

spring-data-jpa @Query 支持正则表达式语法吗?

Spring data jpa中Query和@Query分别返回map结果集

@Query(Spring data / JPA),其中boolean在where条件中