在实际开发中我们使用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;
}
}
修改mybatis的xml文件
set改为collection
<foreach collection="collection" open="(" separator="," close=")" item="val">
${val}
</foreach>
ok啦!
本文参考: https://blog.csdn.net/FU250/article/details/79999925