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;
        }
    }
修改mybatis的xml文件set改为collection
<foreach collection="collection" open="(" separator="," close=")" item="val">
    ${val}
</foreach>

ok啦!

本文参考:https://blog.csdn.net/FU250/article/details/79999925

阅读更多
文章标签: mybatis
个人分类: java web mybatis
上一篇java 反射机制--根据属性名获取属性值
下一篇查看kafka消费数据
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭