mybatis如何接收返回类型为Set<String> 呢

现在想接收返回值为Set<String> 的列表,结果发现里面没有看到相关的方法,不知这种要如何处理呢?
尝试了

  HashSet<String> roles = sqlSessionTemplate.selectList("ShiroUser.findAllRoleNameByUsername",uname)

    HashSet<String> roles = sqlSessionTemplate.select("ShiroUser.findAllRoleNameByUsername",uname);

结果都报错,网上搜索也没能看到相关解决方案。

阅读 29.6k
6 个回答

返回参数写 resultType="String" 即可。
例如:
mapping.xml文件

<select id="selectPk" resultType="String">
  select pk_id from user_operation order by create_time desc 
</select>

mapper文件

Set<String> selectPk();

获取数据,比如直接写在Controller中

Set<String> result = this.mapper.selectPk();
        System.out.println(result);
        if (result.size() > 0) {
            for (String id : result) {
                System.out.println(id);
            }
        }

MyBatis是直接返回List的,可以直接像 @Rebuilding127 的回答使用Mapper类配置来做自动List转换Set。如果要用SqlSession来读取数据的话,可以自动做List到Set的转换,即:

List<String> roleList = sqlSessionTemplate.selectList("ShiroUser.findAllRoleNameByUsername", uname);
Set<String> roleSet = new HashSet<>(roleList);

mybatis源码里面就没有返回值为set的接口,这个现实不了的,只能自己来做逻辑处理了

自己处理一下吧,没有直接返回set的

list不就行了, 反正一个值加个DISTINCT就好了一样不会重

前面一堆误人子弟的回答。

首先,MyBatis支持返回Set,毫无疑问,但是这个支持是指在XML做结果集自动映射时候的支持,博主使用SqlSessionTemplate调用selectList返回多行结果,这个步骤并不会经过MyBatis的ObjectFactory结果映射,所以只能使用List接收,而且Java编译期检查,你用Set编译都不通过

其次,MyBatis如果使用Set作为返回值,默认使用HashSet作为实例,无法排序,相当于ORDER BY语句无效,如果需要排序,可以使用LinkedHashSet作为返回值,如果仅通过Java排序,可以使用SortedSet作为返回值,但元素类型需要实现Comparable接口,使用TreeSet作为返回值

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题