千家信息网

spring data jpa @Query注解中delete语句报错怎么解决

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"spring data jpa @Query注解中delete语句报错怎么解决",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"spring
千家信息网最后更新 2026年11月02日spring data jpa @Query注解中delete语句报错怎么解决

本篇内容主要讲解"spring data jpa @Query注解中delete语句报错怎么解决",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"spring data jpa @Query注解中delete语句报错怎么解决"吧!

spring data jpa @Query注解中delete语句报错

项目中需要删除掉表中的一些数据

@Query("delete from EngineerServices es where es.engineerId = ?1")int deleteByEgId(String engineerId);

但是提示了错误

org.hibernate.hql.QueryExecutionRequestException: Not supported for DML operations

通过查阅相关的资料发现,对于执行update和delete语句需要添加@Modifying注解

@Modifying@Query("delete from EngineerServices es where es.engineerId = ?1")int deleteByEgId(String engineerId);

不过,添加之后运行又出现了另一个错误

nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query

发现缺少Transaction,于是添加@Transactional

@Modifying@Transactional@Query("delete from EngineerServices es where es.engineerId = ?1")int deleteByEgId(String engineerId);

到此,这条delete语句终于可以成功的执行了。

代码示例:

package com.easy.kotlin.chapter11_kotlin_springboot.dao import com.easy.kotlin.chapter11_kotlin_springboot.entity.Imageimport org.springframework.data.domain.Pageimport org.springframework.data.domain.Pageableimport org.springframework.data.jpa.repository.Modifyingimport org.springframework.data.jpa.repository.Queryimport org.springframework.data.repository.PagingAndSortingRepositoryimport org.springframework.data.repository.query.Paramimport org.springframework.transaction.annotation.Transactional /** Created by jack on 2017/7/17.@Query注解里面的value和nativeQuery=true,意思是使用原生的sql查询语句.sql模糊查询like语法,我们在写sql的时候是这样写的like '%?%'但是在@Query的value字符串中, 这样写like %?1%另外,要注意的是: 对于执行update和delete语句需要添加@Modifying注解 */ interface ImageRepository : PagingAndSortingRepository {    @Query("SELECT a from #{#entityName} a where a.isDeleted=0 and a.category like %?1%")    fun findByCategory(category: String): MutableList     @Query("select count(*) from #{#entityName} a where a.isDeleted=0 and a.url = ?1")    fun countByUrl(url: String): Int     @Query("SELECT a from #{#entityName} a where a.isDeleted=0 and a.category like %:searchText%")    fun search(@Param("searchText") searchText: String, pageable: Pageable): Page     @Query("SELECT a from #{#entityName} a where a.isDeleted=0 and a.isFavorite=1")    fun findAllFavorite(pageable: Pageable): Page     @Query("SELECT a from #{#entityName} a where a.isDeleted=0 and a.isFavorite=1 and a.category like %:searchText%")    fun searchFavorite(@Param("searchText") searchText: String, pageable: Pageable): Page     @Modifying    @Transactional    @Query("update #{#entityName} a set a.isFavorite=1 where a.id=?1")    fun addFavorite(id: Long)     @Modifying    @Transactional    @Query("delete from #{#entityName} a where a.id=?1")    fun delete(id: Long) }

JPA使用@Query注解实例

1. 一个使用@Query注解的简单例子

@Query(value = "select name,author,price from Book b where b.price>?1 and b.price findByPriceRange(long price1, long price2);

2. Like表达式

@Query(value = "select name,author,price from Book b where b.name like %:name%")List findByNameMatch(@Param("name") String name);

3. 使用Native SQL Query

所谓本地查询,就是使用原生的sql语句(根据数据库的不同,在sql的语法或结构方面可能有所区别)进行查询数据库的操作。

@Query(value = "select * from book b where b.name=?1", nativeQuery = true)List findByName(String name);

4. 使用@Param注解注入参数

@Query(value = "select name,author,price from Book b where b.name = :name AND b.author=:author AND b.price=:price")List findByNamedParam(@Param("name") String name, @Param("author") String author,        @Param("price") long price);

5. SPEL表达式(使用时请参考最后的补充说明)

'#{#entityName}'值为'Book'对象对应的数据表名称(book)。

public interface BookQueryRepositoryExample extends Repository{    @Query(value = "select * from #{#entityName} b where b.name=?1", nativeQuery = true)    List findByName(String name);}

6. 一个较完整的例子

public interface BookQueryRepositoryExample extends Repository {    @Query(value = "select * from Book b where b.name=?1", nativeQuery = true)     List findByName(String name);// 此方法sql将会报错(java.lang.IllegalArgumentException),看出原因了吗,若没看出来,请看下一个例子     @Query(value = "select name,author,price from Book b where b.price>?1 and b.price findByPriceRange(long price1, long price2);     @Query(value = "select name,author,price from Book b where b.name like %:name%")    List findByNameMatch(@Param("name") String name);     @Query(value = "select name,author,price from Book b where b.name = :name AND b.author=:author AND b.price=:price")    List findByNamedParam(@Param("name") String name, @Param("author") String author,            @Param("price") long price); }

7. S模糊查询注意问题

模糊查询时在原生sql中like后跟随的值需要单独传,%不支持单独出现;在使用length查询数据库时需要()单独括起。

@Repositorypublic interface SaleschargeRespolity extends JpaRepository {     @Query(value = "select p from Salescharge p where ordertime>:startTime and ordertime<:endTime and staffid like :staffidlike and length(staffid)=(length(:staffid)+2)")        List finAllSubChargeInfo(@Param("startTime") Date startTime, @Param("endTime") Date endTime,@Param("staffid") String staffid, @Param("staffidlike") String staffidlike); }

8. 解释例6中错误的原因

因为指定了nativeQuery = true,即使用原生的sql语句查询。使用java对象'Book'作为表名来查自然是不对的。只需将Book替换为表名book。

@Query(value = "select * from book b where b.name=?1", nativeQuery = true)List findByName(String name);

到此,相信大家对"spring data jpa @Query注解中delete语句报错怎么解决"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

注解 语句 查询 数据 例子 数据库 错误 内容 原因 对象 表达式 语法 学习 不同 不对 实用 更深 成功 代码 兴趣 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 河南云网互联网络科技有限公司 山东特亿宝互联网科技有限公司 广州百单互联网科技有限公司 互联网科技会 互联网科技社 互联网与科技金融数据 港股互联网科技股 为想互联网科技 安徽鑫晟辉互联网科技 互联网养老 桔豆科技 互联网 科技服务平台 无锡溥仪互联网科技有限公司 银川新华互联网科技学校地址 团飞科技与伯堂互联网服务平台 华服互联网科技官网 互联网与医疗科技 注册互联网科技公司经营范围大全 互联网科技职业技能培训学校 广州三三互联网科技有限公司 互联网科技企业文化 互联网科技卖菜 宜安科技 互联网金融 上海致骋互联网科技 互联网金融科技委员会 多迪互联网科技有限公司 济南和联互联网科技有限公司 茂名市互联网科技产业园 互联网科技创新的路径 恒生互联网科技业指数调整周期 智帮互联网科技公司最近动向
0