【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
问题
使用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。
来源:oschina
链接:https://my.oschina.net/u/1989321/blog/638650