1.问题现象
Caused by: org.springframework.dao.TransientDataAccessResourceException: Error attempting to get column 'sale_id' from result set. Cause: java.sql.SQLException: Cannot convert value 'éå®æµè¯' from column 19 to TIMESTAMP.
造成原因:需要给表中中增加字段以满足业务需求
2.问题原因
2.1dao层实体
@Data
@Builder
public class OppJobPO {/*** 主键ID*/private Long id;/*** 帖子标题*/private String postTitle;/*** 帖子URL*/private String postUrl;/*** 帖子上架时间*/private Date postCreatedTime;}
2.2 mapper文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="OppJobDao"><resultMap id="OppJobResultMap" type="OppJobPO"><id column="id" property="id" jdbcType="BIGINT"/><result column="post_title" property="postTitle" jdbcType="LONGVARCHAR"/><result column="post_url" property="postUrl" jdbcType="LONGVARCHAR"/><result column="post_created_time" property="postCreatedTime" jdbcType="TIMESTAMP"/></resultMap><sql id="Base_Column_List">id,post_title,post_created_time,post_url</sql><select id="queryByOppId" parameterType="java.util.Map" resultMap="OppJobResultMap">select<include refid="Base_Column_List"/>from opp_jobsorder by created_time desc</select></mapper>
2.3 错误原因
因为OppJobPO使用了@Builder注解,会默认提供一个全参数的构造器,导致mybatis在解析会将查询的结果完全按照构造器的字段类型进行映射解析,实体的字段顺序和查询的字段顺序不一致,导致实体解析报错。
3.结论
a.xml映射的dao层实体最好存在默认的无参数构造器
b.若dao层实体仅存在全参构造器,需要保证查询的字段顺序与构造器的参数顺序完全一致。查询字段缺失或者不一致都会报错。