【报错记录】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 先看看实体类是不是缺少了无参构造函数

你可能感兴趣的:(项目总结,Spring,mybatis,java,数据库)