首先看两段配置:
User实例配置
<mapper namespace="com.zj.logistics.bean.User"> <resultMap type="user" id="userResultMap"> <id property="userid" column="userid" /> <result property="username" column="username" /> <result property="password" column="password" /> <result property="deleteflag" column="deleteflag" /> <collection property="ordersList" column="userid" javaType="ArrayList" ofType="Orders" select="com.zj.logistics.bean.Orders.findOrdersByUserId" /> </resultMap>
<select id="findUserById" parameterType="String" resultMap="userResultMap">
SELECT * FROM user u WHERE u.deleteflag = 0 AND u.userid = #{userid}
</select>
</mapper>
Orders实例配置:
<mapper namespace="com.zj.logistics.bean.Orders">
<resultMap type="orders" id="ordersResultMap">
<id property="orderid" column="orderid" />
<result property="status" column="status" />
<result property="cdate" column="cdate" />
<result property="note" column="note" />
<result property="deleteflag" column="deleteflag" />
<association property="user" column="userid" javaType="User"
select="com.zj.logistics.bean.User.findUserById" />
</resultMap>
<select id="findOrdersByUserId" parameterType="int" resultMap="ordersResultMap">
SELECT * FROM orders o WHERE o.deleteflag = 0 AND o.userid = #{userid}
</select>
</mapper>
很显然,参数类型不匹配。。但是,在mybatis加载的时候,不会报出异常。。更有意思的还在后面
这样配置后,当我们做单元测试时,调用user.xml中的findUserById的方法时,传递进去的是String类型的id,但是查询的结果有两种:
1)字符串id 以数字开头时,若数据库中存在记录,可以轻松查找。。
2) 字符串id 以字母开头时,会报出
Invalid value for getInt() 的异常
而且,异常的定位是在user中,看了很多眼,paramtype是string类型。。让人很难确定问题的原因
最终发现了user和orders的依赖关系,将orders中的int改为String-->OK
个人猜测,原因有一下几点:
1)如下图:
<mapper namespace="com.zj.logistics.bean.User">
<resultMap type="user" id="userResultMap">
<id property="userid" column="userid" />
<result property="username" column="username" />
<result property="password" column="password" />
<result property="deleteflag" column="deleteflag" />
<!-- 这时在orders的findOrdersByUserId方法中,已经将userid作为参数传入,将其类型绑定为int,在findbyuserid时,userid貌似不检测类型 -->
<collection property="ordersList" column="userid" javaType="ArrayList" ofType="Orders"
select="com.zj.logistics.bean.Orders.findOrdersByUserId" />
</resultMap>
</mapper>
可以总结为,在orders的findOrdersByUserId 中,将userid绑定为了int,在user的findByUserId方法中设定的参数起不到预定效果,所以才有了以上的异常。。
反之,如果在orders的findOrdersByUserId 中将参数userid的类型设定为String,而在user中将findByUserId方法中设定的参数改为int,测试的结果是查询正常。。
所以,基本确定,在mybatis进行一对多映射时,已经将userid的类型进行了绑定,在后来通过userid对user进行查找时,虽然你设定了是String类型,但是,最后mybatis还是会认为userid是int类型。。
我们最好的避免方法就是,在进行一对多映射时,要留意相关查询方法的参数类型。。一旦不一致,问题就很难定位了。。。
大家有什么意见,欢迎提出哈。。