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上获得本文的源代码。