Mysql 带有@SqlDelete的JPA软删除导致SQL错误:参数索引超出范围(2>;参数数,即1)
我有Mysql 带有@SqlDelete的JPA软删除导致SQL错误:参数索引超出范围(2>;参数数,即1),mysql,spring-boot,hibernate,jpa,Mysql,Spring Boot,Hibernate,Jpa,我有Basket和BasketItem实体,它们都扩展了BaseEntity,如下所示: @MappedSuperclass 公共类基实体{ @Id@GeneratedValue(策略=GenerationType.IDENTITY) 私人长id; @列(name=“deleted”,nullable=false) private Boolean deleted=false; @Version@Column(nullable=false) 私人长版; } @实体 @其中(子句=“已删除=错误”)
Basket
和BasketItem
实体,它们都扩展了BaseEntity
,如下所示:
@MappedSuperclass
公共类基实体{
@Id@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@列(name=“deleted”,nullable=false)
private Boolean deleted=false;
@Version@Column(nullable=false)
私人长版;
}
@实体
@其中(子句=“已删除=错误”)
@SQLDelete(sql=“UPDATE basket SET deleted=true,其中id=?”)
公共类扩展BaseEntity{
@OneToMany(mappedBy=“basket”,cascade=CascadeType.ALL,orphan=true,fetch=FetchType.LAZY)
私有列表项=新的ArrayList();
}
@实体
@其中(子句=“已删除=错误”)
@SQLDelete(sql=“UPDATE basketItem SET deleted=true,其中id=?”)
公共类BasketItem扩展BaseEntity{
@多通(可选=假)
@JoinColumn(name=“basket\u id”,nullable=false)
私人篮子;
}
现在,当我想从篮子中删除BasketItem
时,我只需调用remove(BasketItem)
on Basket items列表并保存Basket
实例:
@服务
公共类DeleteBasketItemUseCase{
@交易的
公共BasketOutput执行(最终长项目ID,最终长basketId){
//忽略装载和检查
basket.getItems().remove(basketItem);
basket=basketRepository.save(basket);
}
}
删除basketItem
会生成MySQL
错误:
java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1)
日志中生成的SQL为:
UPDATE
basketItem
SET
deleted=true
WHERE
id = ?
我正在使用
Spring Boot 2.2.6.释放
MySQL 8.0
Hibernate 5.4.12.最终版
mysql-connector-java-8.0.19
我更新@SQLDelete
并在注释末尾添加和version=?
:
@SQLDelete(sql = "UPDATE basket SET deleted=true WHERE id=? and version=?")
@SQLDelete(sql = "UPDATE basket_item SET deleted=true WHERE id=? and version=?")
注意:我还更改了数据库表的名称