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

