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


问题

使用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。


转载于:https://my.oschina.net/heweipo/blog/638650

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值