学习思路一样,我们先看源码:
public @interface Modifying {
//如果配置了一级缓存,这个时候用clearAutomatically=true,就会刷新hibernate的一级缓存了, 不然你在同一接口中,更新一个对象,接着查询这个对象,那么你查出来的这个对象还是之前的没有更新之前的状态。这个比较适合老Hibernate的开发的程序员。boolean clearAutomatically() default false;
}
可以通过在 @Modifying 注解实现只需要参数绑定的 update 查询的执行,我们来看个例子根据 lastName 更新 firstname 并且返回更新条数如下:
@Modifying
@Query("update User u set u.firstname = ?1 where u.lastname = ?2")
int setFixedFirstnameFor(String firstname, String lastname);
简单的针对某些特定属性的更新,也可以直接用基类里面提供的通用 save 来做更新(即继承 CrudRepository 接口)。
还有第三种方法就是自定义 Repository 使用 EntityManager 来进行更新操作。
对删除操作的支持如下:
interface UserRepository extends Repository<User, Long> {void deleteByRoleId(long roleId);@Modifying@Query("delete from User u where user.role.id = ?1")void deleteInBulkByRoleId(long roleId);
}
所以现在我们一共有四种方式来做更新操作:
- 通过方法表达式(method name query),上篇内容已介绍;
- 还有一种就是 @Modifying 注解;
- @Query 注解也可以做到;
- 继承 CrudRepository 接口。