JPA定义了两个注释, @Modifying 和 @Query ,它们使我们可以显式地编写更新语句。现在,我们可以告诉我们的应用程序在更新期间的行为方式,而不会给ORM造成负担。
让我们在存储库respository中添加我们的自定义更新方法:
@Repository <b>public</b> <b>interface</b> CustomerRepository <b>extends</b> CrudRepository<Customer, Long> { Customer findById(<b>long</b> id); @Modifying @Query(<font>"update Customer u set u.phone = :phone where u.id = :id"</font><font>) <b>void</b> updatePhone(@Param(value = </font><font>"id"</font><font>) <b>long</b> id, @Param(value = </font><font>"phone"</font><font>) String phone); } </font>
仅仅更新Customer中的phone字段:
<b>public</b> <b>class</b> CustomerDto { <b>private</b> <b>long</b> id; <b>public</b> String name; <b>public</b> String phone; }
在服务中调用上述存储库接口代码:
public void updateCustomer(CustomerDto dto) {
Customer myCustomer = repo.findById(dto.id);
repo.updatePhone(...);
}
如果有很多phone字段怎么办?
<b>public</b> <b>class</b> CustomerDto { <b>private</b> <b>long</b> id; <b>public</b> String name; <b>public</b> String phone; <font><i>//...</i></font><font> <b>private</b> String phone99; } </font>
将这些频繁更新的字段合并成一个子对象或集合:
@Entity <b>public</b> <b>class</b> CustomerStructured { @Id @GeneratedValue(strategy = GenerationType.AUTO) <b>public</b> Long id; <b>public</b> String name; @OneToMany(fetch = FetchType.EAGER, targetEntity=ContactPhone.<b>class</b>, mappedBy=<font>"customerId"</font><font>) <b>private</b> List<ContactPhone> contactPhones; } </font>
可以 在GitHub上 获得本文的源代码。