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

