写了一个联表查询文件记录及文件标签的SQL:
<select id="selectDataFileVoList" resultMap="dataFileVo">SELECTdf.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_nameFROM (SELECT id,file_name,file_url,file_size,extend_name,category_name,file_extracts,create_time,update_time,remarkFROM 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>) dfLEFT JOIN data_file_tag dft ON df.id = dft.file_idLEFT 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 先看看实体类是不是缺少了无参构造函数