我有 Basket
和 BasketItem
实体,它们都扩展了 BaseEntity
,如下所示:
@MappedSuperclass
public class BaseEntity {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "deleted", nullable = false)
private Boolean deleted = false;
@Version @Column(nullable = false)
private Long version;
}
@Entity
@Where(clause = "deleted = false")
@SQLDelete(sql = "UPDATE basket SET deleted=true WHERE id=?")
public class Basket extends BaseEntity {
@OneToMany(mappedBy = "basket", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
private List<BasketItem> items = new ArrayList<>();
}
@Entity
@Where(clause = "deleted = false")
@SQLDelete(sql = "UPDATE basketItem SET deleted=true WHERE id=?")
public class BasketItem extends BaseEntity {
@ManyToOne(optional = false)
@JoinColumn(name = "basket_id", nullable = false)
private Basket basket;
}
现在,当我想从 Basket
中删除 BasketItem
时,我只需在购物篮项目列表上调用 remove(basketItem)
并保存篮子
实例:
@Service
public class DeleteBasketItemUseCase {
@Transactional
public BasketOutput execute(final Long itemId, final Long basketId) {
// loading and checks omitted
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.RELEASE
MySQL 8.0
Hibernate 5.4.12.Final
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=?")
注意:我还更改了数据库表名称!
关于mysql - 使用 @SqlDelete 的 JPA 软删除会导致 SQL 错误 : Parameter index out of range (2 > number of parameters,,即 1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64501778/