使用@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
相关产品推荐
相关产品推荐

