spring-jpa通过自定义sql执行修改碰到的问题

在编写自定义SQL的时候需要注意

  • @Query 注解只能用来查询,想要进行添加、修改和删除操作需要配合 @Modifying 注解一同使用

      @Modifying
      @Query("update AdminUser set username=:#{#adminUser.username},password=:#{#adminUser.password} where id=:#{#adminUser.id}")
      int updateInfoById(@Param("adminUser") AdminUser adminUser);
    
    

    否则执行会报错错误信息如下,提示不支持修改操作

    org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [update com.leimo.module.adminuser.entity.AdminUser set username=:__$synthetic$__1,password=:__$synthetic$__2,updateTime=:__$synthetic$__3 where id=:__$synthetic$__4]; nested exception is java.lang.IllegalStateException: org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [update com.leimo.module.adminuser.entity.AdminUser set username=:__$synthetic$__1,password=:__$synthetic$__2,updateTime=:__$synthetic$__3 where id=:__$synthetic$__4]
    at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:370) ~[spring-orm-5.1.6.RELEASE.jar:5.1.6.RELEASE]
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255) ~[spring-orm-5.1.6.RELEASE.jar:5.1.6.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:527) ~[spring-orm-5.1.6.RELEASE.jar:5.1.6.RELEASE]
    
    
  • 只是添加了 @Modifying 注解在执行修改操作的时候仍然会报错,提示在进行删除和修改的时候需要给方法加上事务
    org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
    at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:402) ~[spring-orm-5.1.6.RELEASE.jar:5.1.6.RELEASE]
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255) ~[spring-orm-5.1.6.RELEASE.jar:5.1.6.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:527) ~[spring-orm-5.1.6.RELEASE.jar:5.1.6.RELEASE]
    
    

    在可以直接在Repository的修改接口上添加 @org.springframework.transaction.annotation.Transactional 注解就可以正常执行修改语句了,或者在调用改接口的方法上添加 @Transactional 事务注解即可

      @Transactional
      @Modifying
      @Query("update AdminUser set username=:#{#adminUser.username},password=:#{#adminUser.password} where id=:#{#adminUser.id}")
      int updateInfoById(@Param("adminUser") AdminUser adminUser);
    
    

    参考博客

    https://www.jianshu.com/p/9d5bf0e4943f

原文地址:https://blog.csdn.net/qq_33430083/article/details/90445618

原文地址:https://www.cnblogs.com/jpfss/p/11162109.html

时间: 2024-10-15 10:16:19

spring-jpa通过自定义sql执行修改碰到的问题的相关文章

JPA中自定义的插入、更新、删除方法为什么要添加@Modifying注解和@Transactional注解?

前几天,有个同事在使用JPA的自定义SQL方法时,程序一直报异常,捣鼓了半天也没能解决,咨询我的时候,我看了一眼他的程序,差不多是这个样子的: 1 @Repository 2 public interface UserRepository extends JpaRepository<User,Long> { 3 4 @Query(value = "delete from pro_user where id = ?1",nativeQuery = true) 5 void d

JPA扩展(自定义sql)

pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4

Python Django 之 直接执行自定义SQL语句(一)

一.执行自定义SQL方法 1.Executing custom SQL directly 直接执行自定义SQL,这种方式可以完全避免数据模型,而是直接执行原始的SQL语句. 2.Manager.raw() 执行原始查询并返回模型实例 二.Executing custom SQL directly Manager.raw() 远远不够,可直接执行自定义SQL,directly execute UPDATE , INSERT , or DELETE queries.django.db.connect

Spring AOP监控SQL执行

对数据库连接池Proxool比较熟悉的读者,都知道Proxool可以记录SQL执行内容和时间等信息日志.我们可以将该日志记录专门的SQL日志文件,对于查找执行特别耗时的SQL起了不小的作用.对于一些其他连接池,没有该特性时,本文介绍Spring AOP切面方法来记录SQL日志. 当然也可以通过数据库提供的特性来查询执行效率较低的SQL,本文不做探讨. 本文介绍使用SpringJdbcTemplate执行SQL,使用其他方法或者ORM思路类似(Hibernate提供了日志记录功能). 使用AOP,

django不定义model,直接执行自定义SQL

如果不想定义model,直接执行自定义SQL,可如下操作: 1. 通过 connections获取db连接,如果是多个数据库,connections['dbName'] 来选择 2. 获取游标 cursor 3. 执行sql: cursor.execute(sql) 4.获取返回结果:fetchone,fetchall (fetchall返回的是元祖,非字典) from django.db import connections cursor = connections['test_db'].cu

一篇搞定spring Jpa操作数据库

开始之前你必须在项目配置好数据库,本文使用的spring boot,相比spring,spring boot省去了很多各种对以来组件复杂的配置,直接在pom配置组件,完后会自动帮我们导入组件 <!-- 导入SpringDataJPA的坐标 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa<

Spring Data 系列(三) Spring+JPA(spring-data-commons)

本章是Spring Data系列的第三篇.系列文章,重点不是讲解JPA语法,所以跑开了JPA的很多语法等,重点放在环境搭建,通过对比方式,快速体会Spring 对JPA的强大功能. 准备代码过程中,保持了每个例子的独立性,和简单性,准备的源码包,下载即可使用.如果,对JPA语法想深入研究的话,直接下载在此基础上进行测试. 前言 Spring Data 系列(一) 入门:简单介绍了原生态的SQL使用,以及JdbcTemplate的使用,在这里写SQL的活还需要自己准备. Spring Data 系

sql执行效率,半同步复制

(1)尽量选择较小的列: (2)将where中用的比较频繁的字段建立索引: (3)select中避免使用*: (4)避免在索引列上使用计算.not in和<>等操作: (5)当只需要一行数据时候使用limit1: (6)保证单表数据不超过200w,实时分割表: 针对查询较慢的语句,可以使用explain来分析该语句具体的执行情况. sql语句应考虑哪些安全性? (1)少使用root账户,应该为不同的动作分配不同的账户: (2)sql执行出错后,不能把数据库中显示的出错信息,直接展示给用户.防止

spring cloud gateway自定义过滤器

在API网关spring cloud gateway和负载均衡框架ribbon实战文章中,主要实现网关与负载均衡等基本功能,详见代码.本节内容将继续围绕此代码展开,主要讲解spring cloud gateway自定义过滤器的功能.本节内容的代码也会提交到GitHub上,注意提交的内容. 本节主要讲解全局过滤器和局部过滤器.注意下面的示例不能作为生产环境的代码,只是简单的演示自定义过滤器的使用方式,无需纠结实现的功能是否完善.下面主要针对不同的过滤器选择几种场景进行代码演示,不代表某个场景就必须