今天在做一个springboot + MybatisPlus做简单的增删改查操作时候,在使用QueryWrapper做查询条件的时候报错:org.springframework.dao.DataIntegrityViolationException:xxx
意思就是 试图从结果集中获取列“xxx”时出错。原因:java.sql.SQLDataException:不能确定xxx的值类型,这让我有点不理解,因为我在使用添加操作时,都是没问题的,所以说不可能是实体的类型出错
出错问题的代码
测试类
@Test
void selects(){
QueryWrapper<Student> qu = new QueryWrapper<>();
qu.select("name","age","sex");
List<Student> users = studentDao.selectList(qu);
System.out.println(users);
}
实体类
@Data
@Accessors(chain = true)
@TableName("t_student")
@AllArgsConstructor
public class Student {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private Double height;
private String birth;
private char sex;
}
看这没啥问题对吧,我还以为是我数据库连接池编码格式不对
找了许久,才发现,问题就出在实体类上,实体类上只有有参构造方法,而没有无参构造方法
而我指定查询就显示['name','age','sex']三个字段,但此时这个实体类只有一个有参构造(包含全属性)
mybatisplus就会找与这些属性对应的值, 然后实例化实体类对象,在找属性对应的值时, mybatisplus会按照实体类属性的构造函数的入参顺序
与sql的查询结果对应,如果实体类的属性和sql结果列不能匹配时都会报错
解决方案
修改实体类
@Data
@Accessors(chain = true)
@TableName("t_student")
@AllArgsConstructor
@NoArgsConstructor //添加无参构造
public class Student {
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private Double height;
private String birth;
private char sex;
}
问题就解决了