Mybatis 查询结果集,自动去重?

overtech_vincent 发布于 2015/05/28 09:56
阅读 6K+
收藏 0

在调用 selectList() 方法返回一个list时,如果查询出的结果集存在以ID主键相同的多条数据时,返回的结果,自动去重?

根据打印的SQL在数据库客户端验证,可以得到正确的数据,但是返回的结果却没有那么多,自动去重了,请问,有什么方法即不用把ID这一列去掉,又能拿到所有重复或不重复的数据?

加载中
0
十月阳光
十月阳光
是不是group by了?
overtech_vincent
overtech_vincent
回复 @十月阳光 : 如果把 ID 这一列拿掉,那么获得的结果集是正确的,问题是 ID必需拿,当然用其他方式获得ID除外。
overtech_vincent
overtech_vincent
@十月阳光 这不是表连接不连接的问题,你可以理解为:一条SQL,查询出了20条数据,通过MyBatis执行,只得到数条,其中拿到的数据和字段,有表ID,并且多条都是重复的。而Mybaits自动给你去重了。
十月阳光
十月阳光
回复 @overtech_vincent : 你是指tab2的数据被去重了?我想你应该理解一下left join,你把left join 改成join试试
overtech_vincent
overtech_vincent
没有 group by, 想要重现问题,很简单,找两张表,一对多关系, from table1 tb1 left join table2 tb2 on tb1.id=tb2.id, tb1和tb2是一对多关系,取tb1的id查询,你就会发现拿到的结果集list,没有实际的多。重复ID的数据都被去掉了。
0
wad12302
wad12302
这个跟myatic 没有关系
0
西门向东
西门向东

我最近也遇到了这个问题,然后不得不debug,一步步的跟进mybatis的源码,    DefaultResultSetHandler  类中 722 和 723 行   final CacheKey rowKey =createRowKey(discriminatedResultMap, rsw, null); Object partialObject = nestedResultObjects.get(rowKey); rowKey 就是namespace+ select id 以及实体id

然后  732 到 734 if (partialObject == null) {

          storeObject(resultHandler, resultContext, rowValue, parentMapping, rsw.getResultSet());
        }

只有在partialObject 为空的时候才会添加值,有重复的在 nestedResultObjects就找到了,所以不添加 

ps :我用的 mybatis的版本是 3.2.4

overtech_vincent
overtech_vincent
我倒是没有去追究它究竟因为什么会这个样子,它既然是主键才会自动去重,那我就给它一个主键伪列,就是声明一个字段来代替主键的值,把查询出来的主键映射到这个字段上去, 办法挺笨的但很有效。
0
安静美男子
安静美男子
请问楼主最后怎么解决的
overtech_vincent
overtech_vincent
最后一个回复里讲了一种方法,伪列。
返回顶部
顶部