Mybatis一对多、多对多查询时数据覆盖问题

问题描述:

在使用mybatis查询一对多结果返回对象的场景中,当主表关联的多条数据完全一致时,返回的对象只有第一条数据

1
2
3
4
5
6
7
8
select
A.ID,
A.USER_ID,
B.RESULT_ID,
B.RATE
from TABLEA A
left join TABLEAB B
on A.ID = B.ID
ID USER_ID RESULT_ID RATE
100000000000001892 abc 10000001 111
100000000000001892 abc 10000001 111
100000000000001892 abc 10000001 111

映射的xml如下

1
2
3
4
5
6
7
8
<resultMap id="xxx" type="xxx">
<result column="ID" property="id"/>
<result column="USER_ID" property="userID"/>
<collection property="resultList" ofType="xxx">
<result column="RESULT_ID" property="resultID" />
<result column="RATE" property="rate"/>
</collection>
</resultMap>

按照设想,返回的 ID=100000000000001892的对象里面的resultList应该包含三条完全一样的数据,但是实际的结果却是只有一条

问题排查:

resultMap中如果不定义类似主键之类的能够区分每一条结果集的字段的话,当数据完全一致的时候会引起后面一条数据覆盖前面一条数据的现象

问题解决:

查询时将一对多的多表的自增主键ID也查询出来,这样resultMap映射的数据就不会完全一致,避免了这个问题,所以在使用mybatis查询的时候最好将表的主键ID查询出来,如果不需要返回ID字段,可以在代码层面实体类转换JSON返回屏蔽掉。