JPA批量删除报错Update/delete queries cannot be typed如何解决
异常原因
JPA规范明确要求UPDATE、DELETE类型的批量操作查询仅返回受影响的行数,不返回实体对象,因此不能调用指定实体类返回类型的createQuery方法生成TypedQuery对象,这就是抛出Update/delete queries cannot be typed异常的根本原因。
正确实现代码
// JPA 3.0+ 版本导包 import jakarta.persistence.Query; // 低版本JPA替换为 import javax.persistence.Query; public void deleteByIds(List<Integer> ids) { String hql = "delete from " + OnboardingTasks.class.getName() + " e WHERE e.id IN :ids"; // 不指定返回实体类型,创建普通Query对象即可 Query query = entityManager.createQuery(hql); query.setParameter("ids", ids); // executeUpdate返回本次操作实际删除的行数,可根据业务需要做合法性校验 int deletedCount = query.executeUpdate(); }
可选优化说明
- 可以对返回的
deletedCount做校验,比如和传入的ids集合大小做比对,判断是否存在无效ID未被删除的情况 - 传入的ID列表如果长度过大,建议分批执行删除,避免SQL长度超出数据库限制
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

