Spring data jpa用自己写的原生sql进行Update操作

文章约定:
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/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值