Cause: java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1).

这是一个神奇的bug。

当我的MyBatis语句为:

    <select id="getRoleByUserAccount" resultType="com.alibaba.fastjson.JSONObject" parameterType="String">
        select u.roleId, r.roleName from role r, user u where u.roleId = r.roleId and u.userAccount = #{ userAccount };

        --         select u.roleId, r.roleName from user u inner join role r on u.roleId = r.roleId where u.userAccount = #{userAccount};


    </select>

会出现如下错误:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='userAccount', mode=IN, javaType=class java.lang.String, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #2 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.sql.SQLException: Parameter index out of range (2 > number of parameters, which is 1).

当我把注释的语句去掉之后:


    <select id="getRoleByUserAccount" resultType="com.alibaba.fastjson.JSONObject" parameterType="String">
        select u.roleId, r.roleName from role r, user u where u.roleId = r.roleId and u.userAccount = #{ userAccount };
    </select>

一切正常!!!!

经验:绝不要在MyBatis的标签语句(、…)中加注释。

若一定要加注释:

可通过如下方式:

    <select id="getRoleByUserAccount" resultType="com.alibaba.fastjson.JSONObject" parameterType="String">

      select u.roleId, r.roleName from user u inner join role r on u.roleId = r.roleId
      where u.userAccount = #{userAccount};

    </select>
    <!--select u.roleId, r.roleName from role r, user u where u.roleId = r.roleId and u.userAccount = #{ userAccount };-->