mybatis如何接受set集合参数
起因:在实际开发中我们使用list进行范围查询,一般已知list集合中的数据为不重复的数据,如果集合中的数据重复概率较大于是采用set集合去除重复的参数,再进行范围查询。现在问题是,调用以下方法,parameter直接传递set集合时,如下:Set<Integer> set = new HashSet<>();set.add(2),set.add(3),return thi
起因:在实际开发中我们使用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
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)