在项目的进行中需要通过 @Modifying 注解完成修改操作(注意:不支持新增)
1.之前有一个业务需要先查询一个结果集,然后将满足结果集中某个条件的另外一张表中的字段做一个属性值的更改,这个更改可能是多个的
代码如下
2.SQL语句如下
3.但是执行的过程中,控制台报错,如下
Can not issue data manipulation statements with executeQuery().
4.后来发现没有添加 @Modifying注解
5.聊一聊@Modifying注解的实际使用
例如一下测试
@Modifying @Query("update Person set email = :email where lastName =:lastName")
void updatePersonEmailByLastName(@Param("lastName")String lastName,@Param("email")String email);
执行报错,异常如下,
关键看这行 Caused by: javax.persistence.TransactionRequiredException: Executing an update/delete query
,说明我们缺少事务配置。
可以在service实现类上面添加事物注解,也可以在方法上面添加事物注解,或者在xml 文件中添加service事物控制器的管理
@Service
@Transactional
<context:component-scan base-package="com.liwei.springdata.service"></context:component-scan>
总结如下
(1)可以通过自定义的 JPQL 完成 UPDATE 和 DELETE 操作。 注意: JPQL 不支持使用 INSERT;
(2)在 @Query 注解中编写 JPQL 语句, 但必须使用 @Modifying 进行修饰. 以通知 SpringData, 这是一个 UPDATE 或 DELETE 操作
(3)UPDATE 或 DELETE 操作需要使用事务,此时需要定义 Service 层,在 Service 层的方法上添加事务操作;
(4)默认情况下, SpringData 的每个方法上有事务, 但都是一个只读事务。 他们不能完成修改操作。