在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 的 EntityManager、save() 方法,但我正在寻找上述类型的 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 Data JPA toPredicate Predicate[] p = new Predicate[list.size()]; query.where(cb.and
spring-data-jpa @Query 支持正则表达式语法吗?