首先上报错:
org.springframework.dao.DataIntegrityViolationException: Error attempting to get column ‘name’ from result set. Cause: java.sql.SQLDataException: Cannot determine value type from string ‘用户名’
从字面上理解,这个报错是因为 Mybatis 查完数据之后,没法把查出来的东西放到实体类里面。
这种情况一般分为这几种
1、数据库的字段跟实体类的字段对不上号。比如数据库里面是 name,实体类里面是 username,就对不上了。
2、数据库的字段类型,跟实体类的字段类型对不上。比如 user_id 在数据库中是 int,到实体类里面是别的东西。
然而,我检查了好久自己的实体类和数据库,发现是对的上的。
上代码
@Data
public class DataTotalVo
{
String unit;
String name;
long value;
public DataTotalVo(String unit, String name, long value)
{
this.unit = unit;
this.name = name;
this.value = value;
}
}
对比一下数据库,数据库内的数据类型也没问题。
很显然,我好像遇到了一个搜不到的问题,搜来搜去,其他答案都指向数据类型不匹配和字段不匹配。
通过跟正常的接口对比。以及找 mybatis 的相关教程,才发现,mybatis 查完数据之后,会调用构造方法,默认会调用无参构造初始化对象,但是此处使用了工具自动生成无参构造,应该会正常调研,但我观看打包完的代码之后,发现打包编译好的代码里面并没有无参构造,原来,是下面这个有参构造的问题。
如果使用了工具帮你自动生成 get、set 方法和无参构造,那么,就尽可能不要自己写带参数的构造方法,会将工具生成的无参构造方法覆盖掉。如果硬要写,那就自己把无参构造方法也写一遍。
正确的代码
@Data
public class DataTotalVo
{
String unit;
String name;
long value;
public DataTotalVo(String unit, String name, long value)
{
this.unit = unit;
this.name = name;
this.value = value;
}
public DataTotalVo()
{
}
}
果然,,有了无参构造方法之后,完美解决报错