mybatis如何接受set集合参数

起因:在实际开发中我们使用list进行范围查询,一般已知list集合中的数据为不重复的数据,如果集合中的数据重复概率较大于是采用set集合去除重复的参数,再进行范围查询。

现在问题是,调用以下方法,parameter直接传递set集合时,如下:

Set<Integer> set = new HashSet<>();
set.add(2),
set.add(3),
return this.getCurSqlSessionTemplate().selectOne(Children.class.getName() + ".findChildren", set);

此时,你在xml里添加foreach循环:

<foreach collection="set" open="(" separator="," close=")" item="val">
    #{val}
</foreach>

运行时,会抛出找不到set参数,如果你传递的参数为Bean,如下param,可以解决以上问题,但并没有找到问题原因。

Map<String,Object> param = new HashMap<>();
param.put("set",set);

接下来找问题原因,通过跟踪源码,我们就会恍然大悟,核心内容已标红,mybatis自己封装了参数返回值,传递的集合为list则命名为list,其他全为collection。

private Object wrapCollection(Object object) {
        DefaultSqlSession.StrictMap map;
        if (object instanceof Collection) {
            map = new DefaultSqlSession.StrictMap();
            map.put("collection", object);
            if (object instanceof List) {
                map.put("list", object);
            }
 
            return map;
        } else if (object != null && object.getClass().isArray()) {
            map = new DefaultSqlSession.StrictMap();
            map.put("array", object);
            return map;
        } else {
            return object;
        }
    }

修改xml中foreach代码如下,就能正常查询出来了

<foreach collection="collection" open="(" separator="," close=")" item="val">
    #{val}
</foreach>

总结:编程跟踪源码是很关键的,能帮助你知其所以然,不单单是只知道使用,因为规则一直在变,获取规则的方式才是最关键的。

————————————————
版权声明:本文为CSDN博主「再见阿郎」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/FU250/article/details/79999925

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值