Mybatis List传参错误

今天在公司写代码的时候遇到了这样的一个错误记录一下
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘subjectIds’ not found. Available parameters are [collection, list]

dao层代码

List<ClazzSubjectDTO> getBySubjectIds(List<String> subjectIds);

xml代码

<select id="getBySubjectIds" parameterType="java.util.List"
            resultType="com.tellhow.aicenter.core.beans.fr.dto.ClazzSubjectDTO">
        select t2.id as subjectId,t3.name,t3.phone
        from t_subject t2
        left join t_class t1
        on t2.class_id=t1.id
        left join t_user t3
        on t3.id=t1.master_id
        <if test="subjectIds!=null and subjectIds.size()>0">
            AND t2.id IN
            <foreach collection="subjectIds" item="subjectId" open="(" separator="," close=")">
                #{subjectId}
            foreach>
        if>
select>

以上代码会报一个错误就是上面提到错误,原因是当我们将一个 List 或数组作为参数传递给 MyBatis 查询语句时,MyBatis 会将它们自动包装在一个 Map 中,以特定的键名作为键。List 实例将会以 list 作为键名,而数组实例将会以 array 作为键名。这样做的目的是为了方便在 SQL 语句中引用集合元素。

解决办法:

1.在dao层代码中添加@Param注解

List getBySubjectIds(@Param("subjectIds") List subjectIds);

2.修改xml中的代码改为collection=“list”,它的意思是接受一个名为 list 的 List 对象作为参数。

<select id="getBySubjectIds" parameterType="java.util.List"
            resultType="com.tellhow.aicenter.core.beans.fr.dto.ClazzSubjectDTO">
        select t2.id as subjectId,t3.name,t3.phone
        from t_subject t2
        left join t_class t1
        on t2.class_id=t1.id
        left join t_user t3
        on t3.id=t1.master_id
        <if test="subjectIds!=null and subjectIds.size()>0">
            AND t2.id IN
            <foreach collection="list" item="subjectId" open="(" separator="," close=")">
                #{subjectId}
            </foreach>
        </if>
</select>

3.把list转成map。

4.把list放到一个bean对象中去。

你可能感兴趣的:(mybatis,java,sql)