使用Mybatis plus 报错:Object is not a functional interface

这篇博客主要介绍了在使用MybatisPlus时遇到的基础错误,问题出在未指定QueryWrapper的泛型参数。正确的做法是为QueryWrapper指定对应的实体类,如Activity。示例代码展示了如何创建并使用Lambda表达式进行条件查询,例如根据deptId查询Activity实体。博客还附带了Activity实体类的完整代码,包括其各个属性和注解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚接触Mybatis Plus遇到的一个基础错误,错误代码是这样的
在这里插入图片描述
通过源码可以发现,QueryWrapper定义的时候使用了泛型,所以在使用的时候必须指定对应的实体类
在这里插入图片描述
正确代码如下:

		QueryWrapper<Activity> query = new QueryWrapper<>();
        query.lambda().eq(Activity::getDeptId,deptId);

注:Activity是一个实体类

@Data
@TableName("club_activity")
@ApiModel(value = "活动实体")
public class Activity {

    @TableId(type = IdType.AUTO) //表示自增
    @ApiModelProperty(value = "主键")
    private Long id;

    @ApiModelProperty(value = "活动名称")
    private String activityName;

    @ApiModelProperty(value = "活动类型")
    private String activityType;

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @ApiModelProperty(value = "活动时间")
    private String activityTime;

    @ApiModelProperty(value = "活动地点")
    private String activityPlace;

    @ApiModelProperty(value = "活动状态")
    private int state;

    @ApiModelProperty(value = "部门id",required = true)
    private Long deptId;

}

### 关于 MyBatis Plus 中 `createBy` 方法报错的原因分析 在使用 MyBatis Plus 进行开发时,如果遇到 `createBy` 方法调用时报错的情况,通常可能涉及以下几个方面: #### 1. **实体类未正确配置逻辑删除字段** MyBatis Plus 提供了自动填充功能,其中 `createBy` 和 `updateBy` 属性用于记录创建者和更新者的相关信息。然而,这些属性需要在实体类中标注相应的注解才能生效。 例如,在实体类中应定义如下字段并标注对应的注解: ```java import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; @TableName("example_table") public class ExampleEntity { @TableField(fill = FieldFill.INSERT) private String createBy; // 创建者 @TableField(fill = FieldFill.UPDATE) private String updateBy; // 更新者 // Getter and Setter methods... } ``` 上述代码片段表明,`createBy` 字段会在插入操作时被自动填充[^3]。 --- #### 2. **未启用全局表单注入器或自定义 MetaObjectHandler** 为了实现 `createBy` 和 `updateBy` 的自动填充功能,需通过继承 `MetaObjectHandler` 并重写其方法来完成初始化设置。以下是具体实现方式: ```java import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; @Component public class CustomMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.strictInsertFill(metaObject, "createBy", () -> "default_user", String.class); this.strictInsertFill(metaObject, "createTime", LocalDateTime::now, LocalDateTime.class); } @Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, "updateBy", () -> "default_user", String.class); this.strictUpdateFill(metaObject, "updateTime", LocalDateTime::now, LocalDateTime.class); } } ``` 此部分代码的作用是在执行插入或更新操作前,动态填入默认值或者当前登录用户的 ID[^4]。 --- #### 3. **数据库字段类型不匹配** 另一个常见问题是数据库中的字段类型与 Java 实体类的字段类型不符。比如,假设 `create_by` 列的数据类型为整数 (`INT`) 而不是字符串 (`VARCHAR`),那么当尝试向该列赋值一个字符串类型的用户名时就会抛出异常。 因此建议检查数据库设计文档以及实际建表语句是否一致。对于 PostgreSQL 数据库而言,还需注意数组类型的支持情况[^2]。 --- #### 4. **函数式接口冲突** 有时可能会因为某些原因导致框架误判某个对象为函数式接口从而引发错误提示:“object is not a functional interface”。这种情况下可以排查是否存在多版本依赖问题或者是第三方扩展包干扰正常流程[^1]。 可以通过清理 Maven 缓存重新构建项目排除潜在隐患;另外也可以升级至最新稳定版 MyBatis Plus 来获取修复后的特性支持。 --- ### 总结解决方案 综上所述,针对 `createBy` 报错现象可以从以下四个方面入手解决问题: - 确认实体类已正确定义相关字段及其注解; - 注册全局处理器组件以处理自动填充需求; - 对照数据库结构验证数据类型一致性; - 排查是否有其他因素引起的功能性判断失误。 希望以上内容能够帮助到您!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Otto_1027

蟹蟹你,我会继续努力的~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值