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

Spring JPA实现软删除遇类型不匹配错误求助

解决JPA软删除中@ParamDef的类型不匹配错误

核心错误修复

你遇到的Type mismatch: cannot convert from String to Class<?>错误,根源是新版本Hibernate(适配Jakarta Persistence)中@ParamDef的type参数要求传入Class对象,而非字符串类型。

修改CloudProduct.java中的@FilterDef注解,将type = "boolean"替换为type = Boolean.class:

@FilterDef(name = "deletedProductFilter", parameters = @ParamDef(name = "isDeleted", type = Boolean.class))

补充修正(确保软删除功能正常)

除了核心错误,你的代码还有几处需要调整的地方:

  1. 修正@SQLDelete的表名与主键列
    你的@SQLDelete注解中表名和主键列与实体类配置不一致,会导致删除操作失效:

    @SQLDelete(sql = "UPDATE cloud_product_info SET deleted = true WHERE product_id=?")
    

    (注:实体类@Table指定表名为cloud_product_info,主键productId对应数据库列名默认是product_id)

  2. 添加默认过滤已删除数据的注解
    为了让普通查询默认排除已标记删除的数据,给实体类添加@Where注解:

    @Where(clause = "deleted = false")
    
  3. 统一字段与getter的类型
    实体类中deleted字段是boolean类型,但getter返回Boolean,建议保持类型一致,避免潜在空指针问题:

    public boolean getDeleted() {
        return deleted;
    }
    

修改后的CloudProduct核心代码片段

@Entity
@Table(name="cloud_product_info")
@SQLDelete(sql = "UPDATE cloud_product_info SET deleted = true WHERE product_id=?")
@FilterDef(name = "deletedProductFilter", parameters = @ParamDef(name = "isDeleted", type = Boolean.class))
@Filter(name = "deletedProductFilter", condition = "deleted = :isDeleted")
@Where(clause = "deleted = false")
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value = {"createdAt", "updatedAt"}, allowGetters = true)
public class CloudProduct {
    // ... 其他字段与方法
    private boolean deleted = Boolean.FALSE;

    public boolean getDeleted() {
        return deleted;
    }

    public void setDeleted(boolean deleted) {
        this.deleted = deleted;
    }
    // ... 其他方法
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:45:36