相关文章推荐
逆袭的红酒  ·  社区|腾讯体育 - 看NBA足球网球赛车NFL·  3 月前    · 
耍酷的墨镜  ·  opencv如何判断一个点是否在矩形内 ...·  11 月前    · 
俊逸的铅笔  ·  旅行证补发·  11 月前    · 
绅士的电脑桌  ·  python while ...·  1 年前    · 
紧张的香瓜  ·  飞机陷落什么时候上映_电影飞机陷落什么时候上 ...·  2 年前    · 
小百科  ›  DataIntegrityViolationException、DataConversionException异常解决开发者社区
构造函数
打酱油的小虾米
1 年前
KenTalk

DataIntegrityViolationException、DataConversionException异常解决

前往小程序,Get 更优 阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
KenTalk
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > DataIntegrityViolationException、DataConversionException异常解决

DataIntegrityViolationException、DataConversionException异常解决

作者头像
KenTalk
发布 于 2023-04-07 15:42:46
1.4K 0
发布 于 2023-04-07 15:42:46
举报
文章被收录于专栏: Ken的杂谈

一、问题现象

使用MyBatis查询数据在数据映射环节发生异常:

org.springframework.dao.DataIntegrityViolationException

(表象异常) 数据完整性 约束异常,通常在数据更新/插入时,数据类型不匹配引起

com.mysql.cj.exceptions.DataConversionException

(根异常)数据转换时发生异常

主要报错信息:

代码语言: javascript
复制
org.springframework.dao.DataIntegrityViolationException: Error attempting to get column 'user_id' from result set.  
Cause: java.sql.SQLDataException: Unsupported conversion from LONG to java.time.LocalDateTime; 
Unsupported conversion from LONG to java.time.LocalDateTime; 
nested exception is java.sql.SQLDataException: Unsupported conversion from LONG to java.time.LocalDateTime] with root cause
com.mysql.cj.exceptions.DataConversionException: Unsupported conversion from LONG to java.time.LocalDateTime

二、问题原因

查询结果映射的Model使用了lombok的 @ Builder注解,使用了该注解的类,会在编译时为该类 只生成全参数的构造函数,不会生成无参构造函数 ,那么就必须在实例化该Model时通过构造函数赋值,如果返回的列与构造函数参数顺序不一致,就会导致该问题

1、问题代码示例:Model

  • 源文件
代码语言: javascript
复制
@Builder
@Data
public class Order {
    private long id;
    private long user_id;
    private LocalDateTime submit_time;
    private int status;
    /*省略其他字段*/
}
  • 编译结果

可以在编译结果target目录中查看Order.class文件

代码语言: javascript
复制
public class Order {
    private long id;
    private long user_id;
    private LocalDateTime submit_time;
    private int status;
    Order(final long id, final long user_id, final LocalDateTime submit_time, final int status) {
        this.id = id;
        this.user_id = user_id;
        this.submit_time = submit_time;
        this.status = status;
    /*省略get、set方法*/
}

2、问题代码示例:Mapper

代码语言: javascript
复制
@Mapper
public interface OrderMapper {
    @Select("SELECT id,user_id,status,submit_time FROM order")
    List<Order> getAllOrder();
}

三、解决办法

可以通过添加无参构造函数,或者调整查询列顺序的方式解决问题,二者任选其一即可

1、注解添加无参构造函数(推荐)

使用 @ NoArgsConstructor, @ AllArgsConstructor,让lombok Model同时具备全参数和无参数构造函数

代码语言: javascript
复制
@Builder
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Order {
    private long id;
    private long user_id;
    private LocalDateTime submit_time;
    private int status;
    /*省略其他字段*/
}

2、手动添加无参构造函数

手动添加构造函数,并使用 @ Tolerate注解让lombok 忽略该构造函数

代码语言: javascript
复制
@Builder
@Data
public class Order {
    private long id;
    private long user_id;
    private LocalDateTime submit_time;
    private int status;
    /*省略其他字段*/
    @Tolerate
    Order() {}
 
推荐文章
逆袭的红酒  ·  社区|腾讯体育 - 看NBA足球网球赛车NFL
3 月前
耍酷的墨镜  ·  opencv如何判断一个点是否在矩形内 C++ - CSDN文库
11 月前
俊逸的铅笔  ·  旅行证补发
11 月前
绅士的电脑桌  ·  python while 判断多个条件,python条件判断&while循环-CSDN博客
1 年前
紧张的香瓜  ·  飞机陷落什么时候上映_电影飞机陷落什么时候上映_莫斯科陷落3什么时候上映 - 抖音
2 年前
Link管理   ·   Sov5搜索   ·   小百科
小百科 - 百科知识指南