mysql - 使用 @SqlDelete 的 JPA 软删除会导致 SQL 错误 : Parameter index out of range (2 > number of parameters,,即 1)

标签 mysql spring-boot hibernate jpa

我有 BasketBasketItem 实体,它们都扩展了 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/

相关文章:

Java - 获取封闭实例

c# - ComboBox SelectedIndexChanged 和 Mysql fatal error

java - Spring Boot 执行器 MySQL 数据库健康检查

php - [已解决]PDO/MySQL 准备语句注入(inject)分号

java - 如何在 Vaadin Spring Boot Web 应用程序中创建图像幻灯片?

java - 用 application.properties 覆盖默认的 Spring-Boot application.properties

hibernate - Grails-java.lang.IllegalStateException:无法初始化代理

java - Junit Hibernate 多次创建数据库模式

php - 根据下拉菜单的结果获取表字段(从另一个表字段填充)

php - 使用php备份整个mysql数据库