Mybatis 查询结果和sql执行结果不符

原创
2016/03/16 16:46
阅读数 5.8K


问题

使用mybatis查询数据,看到执行sql的日志,同时也打印了查询的结果个数为3,可是通过 selectList 得到的 List list  却只有1条数据;


分析

一开始以为是缓存导致,因为mybatis有缓存,而且缓存的结果是可以改变的,可是二级缓存默认关闭,一级缓存必须在同一个 sqlsession对象的生命周期内,

这两个条件都排查了,没问题。


解决

然后,看到了select 的返回值是 resultMap , 沿着 resultMap 去看数据结构发现里面指定了一个字段为ID,问题就在这里,该表的主键是联合主键,有多个字段一起作为key,

所以查询的结果可不一定就是以这个ID作为识别记录的key,因为查询的结果ID都是一样的,所以Mybatis在封装ResultRow的时候只会有一条。

问题前(联合主键只指定了一个字段作为ID):

<resultMap id="TodoTask" type="map">
   <id column="businessId" property="businessId"></id>
   <result column="businessName" property="businessName"></result>
   <result column="todoUserId" property="todoUserId"></result>
   <result column="todoUserName" property="todoUserName"></result>
</resultMap>

问题后(联合主键的所有字段都作为ID):

<resultMap id="TodoTask" type="map">
   <id column="businessId" property="businessId"></id>
   <id column="businessName" property="businessName"></id>
   <id column="todoUserId" property="todoUserId"></id>
   <result column="todoUserName" property="todoUserName"></result>
</resultMap>


建议

另外为了提升性能,mybatis建议指定ID字段,所以如果你是采用 resultMap=“map” 作为返回结果,如果记录很多的话最好还是改改了,改成 resultType="",这样的好处就是可以自定义ID。


展开阅读全文
打赏
1
2 收藏
分享
加载中
更多评论
打赏
0 评论
2 收藏
1
分享
返回顶部
顶部