文章约定:
t_master 是数据库的表名
TMaster 是表映射的实体类类名
先演示两种错误写法:
@Modifying()
@Query(value = " UPDATE t_master SET status = 'YES' WHERE id = ?1", nativeQuery = true)
void update(String id);
@Transactional
@Modifying()
@Query(value = " UPDATE t_master SET status = 'YES' WHERE id = ?1")
void update(String id);
这两种写法都会报错:
第一种直接启动不了项目。
原因: 因为jpa要求,更新和删除操作必须有事务支持
第二种报错如下:
Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
原因:因为@Query中的语句是原生sql,必须加上nativeQuery = true,否则不能映射;
以下三种为正确写法:
加上此包下的
import org.springframework.transaction.annotation.Transactional;
@Transactional注解
@Transactional
@Modifying()
@Query(value = " UPDATE t_master SET status = 'YES' WHERE id = ?1", nativeQuery = true)
void update(String id);
@Transactional
@Modifying
@Query(value = "update TMaster set status = 'NO' where id = ?1 and name = ?2")
int update(String id, String name);
以上两种写法是等同的,都可以。
总结修改操作需要注意的点:
1、要同时加上@Transactional 、@Modifying 、 @Query 这三个注解。
2、用数据库表明映射要加上nativeQuery = true
3、手写的sql可以直接使用数据库映射的java对象,但不需要加nativeQuery = true
具体参考官方API:https://docs.spring.io/spring-data/jpa/docs/2.3.2.RELEASE/api/