这是一个神奇的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 };-->