You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用@Query注解执行更新语句时触发IllegalSelectQueryException求助

问题解决:@Query执行UPDATE抛出IllegalSelectQueryException

问题原因

你用@Query编写了UPDATE语句,但Spring Data JPA默认认定@Query注解的是SELECT查询语句,因此会抛出异常提示“期望SELECT却得到UPDATE”。另外你的方法返回值设为String也不符合更新操作的语义——UPDATE操作返回的是受影响的行数,而非字符串。

解决方案

需要做以下3处关键修改:

  • 添加@Modifying注解:明确告知Spring Data这是一条数据修改语句(UPDATE/DELETE),而非查询语句。
  • 调整方法返回值:将返回类型从String改为int,代表执行更新后受影响的记录条数。
  • 添加事务注解:更新操作需要事务支持,可在Repository方法上添加@Transactional,或者在调用该方法的Service层方法上配置事务。
  • 校验JPQL字段名:确保JPQL中的字段名和实体类Reservation的属性名完全一致(注意大小写,比如实体类属性是status小写,JPQL里也要对应使用小写)。

修正后的代码

@Repository
public interface ReservationRepository extends JpaRepository<Reservation,String> {
    @Modifying
    @Transactional
    @Query("UPDATE Reservation SET status = :status WHERE pnr = :pnr")
    int setStatus(@Param("status") String status, @Param("pnr") String pnr);
}

补充说明

  • @Modifying必须和@Query配合使用,用于标记非查询的DML操作。
  • @Transactional保证更新操作在事务中执行,避免出现数据不一致的情况。
  • 返回值int可以直观告诉你本次更新影响了多少条记录,方便后续业务逻辑判断。

内容的提问来源于stack exchange,提问作者MatildaEliz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 01:54:56