如何使用Spring Data进行一个实体中一部分数据的更新? | Baeldung


JPA定义了两个注释,@Modifying@Query,它们使我们可以显式地编写更新语句。现在,我们可以告诉我们的应用程序在更新期间的行为方式,而不会给ORM造成负担。
让我们在存储库respository中添加我们的自定义更新方法:

@Repository
public interface CustomerRepository extends CrudRepository<Customer, Long> {
    Customer findById(long id);

 @Modifying
@Query("update Customer u set u.phone = :phone where u.id = :id")
void updatePhone(@Param(value =
"id") long id, @Param(value = "phone") String phone);

}

仅仅更新Customer中的phone字段:

public class CustomerDto {
    private long id;
    public String name;
    public String phone;
  
}

在服务中调用上述存储库接口代码:
public void updateCustomer(CustomerDto dto) {
    Customer myCustomer = repo.findById(dto.id);
    repo.updatePhone(...);
}


如果有很多phone字段怎么办?

public class CustomerDto {
    private long id;
    public String name;
    public String phone;
    //...
    private String phone99;
}

将这些频繁更新的字段合并成一个子对象或集合:

@Entity public class CustomerStructured {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    public Long id;
    public String name;
    @OneToMany(fetch = FetchType.EAGER, targetEntity=ContactPhone.class, mappedBy="customerId")    
    private List<ContactPhone> contactPhones;
}

可以在GitHub上获得本文的源代码。