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

Spring Boot多对多关联下JPA删除中间表数据查询报错如何解决

错误原因

你当前的报错是因为@Query注解默认使用JPQL(Java持久化查询语言),JPQL是面向实体对象的查询语言,只能操作映射好的实体、实体属性,不能直接识别数据库原生表名customer_coupons,所以触发了查询校验失败。


方案1:使用原生SQL实现(推荐,性能更高)

不需要额外配置,只要给@Query添加nativeQuery = true参数指定走原生SQL,同时调整方法返回值(修改类操作返回受影响的行数即可,不需要返回List):

@Repository
public interface CouponRepository extends JpaRepository<Coupon, Integer> {
    @Modifying
    @Query(value = "DELETE FROM customer_coupons WHERE coupons_id = :couponId", nativeQuery = true)
    int deletePurchases(int couponId);
}

注意:调用该方法时需要在所在方法上添加@Transactional注解,否则修改操作会因为没有事务支持报错。


方案2:不用原生SQL,用JPQL实现

如果不想用原生SQL,也可以通过维护关联关系的Customer实体完成删除,不需要加级联配置:

@Modifying
@Query("UPDATE Customer c SET c.coupons = REMOVE(c.coupons, :coupon) WHERE :coupon MEMBER OF c.coupons")
int deletePurchases(@Param("coupon") Coupon coupon);

使用该方案需要先根据couponId查询到Coupon实体再传入,不需要写数据库相关语句兼容性更好,但多了一次实体查询,性能比原生SQL稍差。


疑问解答

你不需要额外添加其他配置,也不是必须使用原生SQL,两种方案都可以满足需求,优先推荐原生SQL方案逻辑更直接、执行效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 03:30:06