如何使用Spring Data進行一個實體中一部分資料的更新? | Baeldung

banq發表於2020-06-19

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上獲得本文的原始碼。
 

相關文章