【报错记录】mybatis映射对应的类没有无参构造引发的问题
写了一个联表查询文件记录及文件标签的SQL:
<select id="selectDataFileVoList" resultMap="dataFileVo">
SELECT
df.id AS id,
df.file_name,
df.file_url,
df.file_size,
df.extend_name,
df.category_name,
df.file_extracts,
df.create_time,
df.update_time,
df.`remark`,
dt.id AS tag_id,
dt.tag_name AS tag_name
FROM (
SELECT id,
file_name,
file_url,
file_size,
extend_name,
category_name,
file_extracts,
create_time,
update_time,
remark
FROM data_file
<where>
<if test="fileName != null and fileName != ''">
AND file_name like concat('%',#{fileName},'%')
</if>
<if test="fileUrl != null">
AND file_url = #{fileUrl}
</if>
<if test="extendName != null">
AND `extend_name` = #{extendName}
</if>
<if test="categoryName != null">
AND `category_name` = #{categoryName}
</if>
<if test="tagId != null">
AND id IN
(SELECT file_id FROM data_file_tag WHERE tag_id = #{tagId})
</if>
</where>
) df
LEFT JOIN data_file_tag dft ON df.id = dft.file_id
LEFT JOIN data_tag dt ON dt.id = dft.tag_id
</select>
这个SQL查询出现报错,Cause: java.lang.IllegalArgumentException: argument type mismatch.参数不匹配。
mabatis的映射为:
<resultMap id="dataFileVo" type="cn.lycode.data.domain.vo.DataFileVo">
<id column="id" property="id"/>
<result column="file_name" property="fileName"/>
<result column="file_url" property="fileUrl"/>
<result column="file_size" property="fileSize"/>
<result column="extend_name" property="extendName"/>
<result column="category_name" property="categoryName"/>
<result column="file_extracts" property="fileExtracts"/>
<result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/>
<result column="remark" property="remark"/>
<collection property="tagVoList" ofType="cn.lycode.data.domain.vo.DataTagVo">
<id column="tag_id" property="id"/>
<result column="tag_name" property="tagName"/>
</collection>
</resultMap>
发现如果最后一个List内容没有的的话就不报错, 有就会报不匹配的错误。
没查出什么原因,准备先注释掉最后的集合映射。
<collection property="tagVoList" ofType="cn.lycode.data.domain.vo.DataTagVo">
<id column="tag_id" property="id"/>
<result column="tag_name" property="tagName"/>
</collection>
然后发现报错内容变为越界异常:Error querying database. Cause: java.lang.IndexOutOfBoundsException:
按理说mybatis映射并没有要求实体类和映射的字段必须全部包含呀?
后面在查到原因是:自定义实体类没有无参构造方法。
参考:https://blog.csdn.net/qq_42429057/article/details/125613076
实体类源码:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DataFileVo {
/**
* 主键
*/
private Long id;
/**
* 文件名
*/
@Excel(name = "文件名")
private String fileName;
/**
* 文件url
*/
@Excel(name = "文件url")
private String fileUrl;
/**
* 文件大小
*/
@Excel(name = "文件大小")
private Long fileSize;
/**
* 文件类型
*/
@Excel(name = "文件类型")
private String extendName;
/**
* 文件分类
*/
@Excel(name = "文件分类")
private String categoryName;
/**
* 文件摘要
*/
@Excel(name = "文件摘要")
private String fileExtracts;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;
/**
* 备注
*/
private String remark;
/**
* 文件标签
*/
@Excel(name = "文件标签")
private List<DataTagVo> tagVoList;
总结
遇到 Cause: java.lang.IllegalArgumentException: argument type mismatch. 或者 Cause: java.lang.IndexOutOfBoundsException 先看看实体类是不是缺少了无参构造函数