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

JpaRepository执行Delete操作报不支持DML操作异常排查

异常触发原因

你遇到的org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations异常,核心原因是对DML类型的JPQL查询错误调用了查询结果获取方法:

  • getSingleResult()/getResultList()是Hibernate/JPA专门为SELECT查询设计的方法,仅用于返回查询到的实体/数据结果,完全不支持DELETE、UPDATE、INSERT这类DML操作
  • 你的Repository代码中在执行DELETE语句时,先调用了query.getSingleResult(),这行代码执行时就会直接抛出上述异常,后续的query.executeUpdate()根本没有机会执行

另外你的代码还有两处逻辑问题:

  • JPQL中delete from UserModel as u的as关键字在DELETE语句中属于非标准写法,部分Hibernate版本会解析报错
  • Controller层方法定义的返回值是void,方法内写的ResponseEntity.ok(null)没有作为返回值返回,接口不会返回预期的200响应
修复步骤

1. 修复Repository层删除逻辑

移除错误的getSingleResult()调用,DML操作仅需调用executeUpdate()即可,同时修正JPQL的非标准写法:

@Transactional
@Override
public void deleteById(long id) {
    Query query = entityManager.createQuery(
            "delete from UserModel u where u.id=:id"
    ).setParameter("id", id);
    // 执行DML删除,返回值为受影响的记录行数
    int deleteCount = query.executeUpdate();
    // 可选校验:如果deleteCount为0说明对应ID的用户不存在,可按需抛出业务异常
}

2. 修复Controller层响应逻辑

调整方法返回值类型,将构造的响应实体正确返回:

@DeleteMapping("/deleteUser")
public ResponseEntity<Void> deleteUser(@RequestParam long id) {
    userRepository.deleteById(id);
    return ResponseEntity.ok().build();
}

完成以上修改后,删除用户的逻辑即可正常执行,不会再抛出该DML操作相关异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:51:20