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))
补充修正(确保软删除功能正常)
除了核心错误,你的代码还有几处需要调整的地方:
修正@SQLDelete的表名与主键列
你的@SQLDelete注解中表名和主键列与实体类配置不一致,会导致删除操作失效:@SQLDelete(sql = "UPDATE cloud_product_info SET deleted = true WHERE product_id=?")(注:实体类
@Table指定表名为cloud_product_info,主键productId对应数据库列名默认是product_id)添加默认过滤已删除数据的注解
为了让普通查询默认排除已标记删除的数据,给实体类添加@Where注解:@Where(clause = "deleted = false")统一字段与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
相关产品推荐
相关产品推荐

