Unsupported conversion from LONG to java.time.LocalDateTime错误

今天执行数据查询时出现了一个很奇怪的Bug,检查了一下实体类属性和数据库字段类型和方法名都能匹配上,但是却一直提示类型映射错误。

List<Ebbinghaus> list = list(queryWrapper);
org.springframework.dao.DataIntegrityViolationException: 
Error attempting to get column 'user_id' from result set. 
Cause: java.sql.SQLDataException: 

检查了Mapper接口,Service接口都没有写错,但就是一直报这个错误,我还用@TableField注解将实体类中与数据库表的映射字段映射起来,防止错误,但还是无济于事。

@Data
public class Ebbinghaus implements Serializable {

    @TableField("id")
    private Integer id;

    @TableField("word_id")
    private Long wordId;

    @TableField("user_id")
    private Long userId;

    @TableField("send_time")
    private LocalDateTime sendTime;

    @TableField("count")
    private Integer count;

    public Ebbinghaus(Long wordId, Long userId, LocalDateTime sendTime) {
        this.wordId = wordId;
        this.userId = userId;
        this.sendTime = sendTime;
    }
}

最后发现是我之前需要构造函数传参时发生的错误,因为只需要传部分参数,所以就重写了构造方法,但是忘记写无参跟全参了,之前没有什么重写构造函数的需求,所以都不会写无参构造方法,所以一旦指定了非无参构造方法,就会覆盖默认的无参构造方法。MyBatis Plus在进行查询操作时,会使用反射来创建实体类对象,并通过调用无参构造方法来实例化对象。如果实体类没有无参构造方法,MyBatis Plus将通过已有的构造方法创建对象,而此时类中的构造方法只有一部分,导致查询结果无法正确映射到实体类属性上,所以在进行list()获取数据库数据时,参数是依赖构造函数从第一个开始到结束,我本身的数据表字段跟实体类顺序是一致的,所以在只有三个参数的构造函数情况下,前两个能匹配上,但第三个参数user_id就类型转换失败了。提示不能从Long类型转为LocalDataTime。解决方法就是直接设置一个无参或者全参构造方法:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Ebbinghaus implements Serializable {

    同上。。。
}

你可能感兴趣的:(Mybatis-Plus,异常合辑,java,mybatis)