使用Spring data Jpa 注解方式修改数据遇到的异常
问题描述:在使用Spring data jpa @Query 注解执行 update 操作的时候遇到如下的异常
org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [update com.study.jpa.pojo.SysUser u set u.userName = :userName where u.id = :id]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.errorIfDML(QueryTranslatorImpl.java:311) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:362) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1490) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1445) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1414) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1463) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
相关 Repository 的代码如下所示:
@Query(value = "update SysUser u set u.userName = :userName where u.id = :id")
int changeUserName(@Param("id") Long id,@Param("userName") String userName);
百度查询了一下,Spring data jpa 在执行增删改的时候需要添加 @Modifying 注解,于是修改代码如下
@Modifying
@Query(value = "update SysUser u set u.userName = :userName where u.id = :id")
int changeUserName(@Param("id") Long id,@Param("userName") String userName);
执行修改操作之后,依旧报异常但是异常信息已经改变如下
javax.persistence.TransactionRequiredException: Executing an update/delete query
at org.hibernate.query.internal.AbstractProducedQuery.executeUpdate(AbstractProducedQuery.java:1496) ~[hibernate-core-5.2.17.Final.jar:5.2.17.Final]
at org.springframework.data.jpa.repository.query.JpaQueryExecution$ModifyingExecution.doExecute(JpaQueryExecution.java:256) ~[spring-data-jpa-2.0.8.RELEASE.jar:2.0.8.RELEASE]
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:91) ~[spring-data-jpa-2.0.8.RELEASE.jar:2.0.8.RELEASE]
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:136) ~[spring-data-jpa-2.0.8.RELEASE.jar:2.0.8.RELEASE]
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:125) ~[spring-data-jpa-2.0.8.RELEASE.jar:2.0.8.RELEASE]
上面报了需要事务的异常,于是再次修改代码如下,添加 @Transactional 注解,程序正常,数据库信息修改成功。
@Transactional
@Modifying
@Query(value = "update SysUser u set u.userName = :userName where u.id = :id")
int changeUserName(@Param("id") Long id,@Param("userName") String userName);