在使用Spring Data Jpa时使用事务执行自定义更新语句遇到的问题

jpa使用自定义语句只需要在对应的接口里添加自定义方法,在方法上添加@Query(value=“from user where userid = ? and username =?”)
public void selectOne( int id,String name )
通常情况下只用? 来当占位符就可以,是 jpql语句按照顺序来读取参数

@Query(value=“from user where userid = ?2 and username =?1”)
public void selectOne( String name,int id,)
也可以通过在?后面加数字来指定对应的参数,数字是从1开始的。

当执行 插入和更新语句时,需要在@Query下面或者上面添加@Modifying
例如 在使用Spring Data Jpa时使用事务执行自定义更新语句遇到的问题

在定义 jpql语句是 jpa是根据实体类来查询,而不是根据数据库的表 ,因此在写 update 后面加 表对应实体类 的名字,否则就会报错
XXX is not mappered

其次在修改完jpql 语句之后报错
Caused by: javax.persistence.TransactionRequiredException: Executing an update/delete query
在使用Spring Data Jpa时使用事务执行自定义更新语句遇到的问题
在测试 执行自定义的更新方法 处 添加了事务注解 @Transcational之后解决了,报错问题,但是正常运行完 结果数据库里数据没有更新,是因为事务没有提交, Spring Data Jpa 在使用事务注解时,执行完默认回滚 ,所以需要在@Transactional 下面加上@Rollback(value=false)注解 来设置不自动回滚