mybatis查询数据后,封装为Map集合的方法

9 篇文章 0 订阅
4 篇文章 0 订阅

由于之前需要把一个集合的数据遍历查询mybatis然后和原数据进行组合,当时使用了四重for循环,其中有部分没有处理好,加上巨大的笛卡尔积,导致出现了oom,所以后续我全部采用map取出的方式进行匹配;

这里就用到了这种写法
Mapper:

@MapKey("userId")
    HashMap<Long,LookMyResumeUserInfoAndAuth> getResumeGuestUserInfo(@Param("userIds") List<Long> userIds);

注解中写的是你实体中充当主键的属性名,如果使用了别名,需要是别名
SQL:

<select id="getResumeGuestUserInfo" resultType="com.asanar.common.vo.View.ResumeView.LookMyResumeUserInfoAndAuth">
    SELECT us.id           AS userId,
           info.first_name AS firstName,
           info.last_name  AS lastName,
           logo.logo_url   AS logo
    FROM ad_user AS us
             LEFT JOIN ad_user_info AS info ON info.user_id = us.id
             LEFT JOIN ad_user_logo AS logo ON us.id = logo.user_id AND logo.is_now = 1
    WHERE
          us.id IN
          <foreach collection="userIds" item="userId" open=" (" separator="," close=") " >
              #{userId}
          </foreach>
</select>

这里有两个坑
1:
这样写idea编译时会报错,告诉你,mapper对应的结果类型不正确,如果使用纠错,会把xml中对应的结果类型给你改变成java.util.Map,,而不是你原先查询的实体;这样依然能查询出数据,但是诡异的是。无法从map中取出数据,无论使用什么类型的key都无法取出,但是debug中可以看到map中的数据

解决 办法:不管他。或者使用注解sql(眼不见心不烦);

2:
循环遍历集合参数的时候,提示找不到参数param;
原因:


private Object wrapCollection(Object object) {
        DefaultSqlSession.StrictMap map;
       // 如果传入参数是一个集合
        if (object instanceof Collection) {
            //创建1个Map
            map = new DefaultSqlSession.StrictMap();
 
            map.put("collection", object);
            //注意 如果参数是list
            if (object instanceof List) {
                //那么传来的参数,collection的默认写法应该 collection="list"
                map.put("list", object);
            }
 
            return map;
        } else if (object != null && object.getClass().isArray()) {
            map = new DefaultSqlSession.StrictMap();
            //数组的默认写法为collection="array"
            map.put("array", object);
            return map;
        } else {
            return object;
        }
    }

源码中对参数进行了默认的配置,
所以,循环的时候这样写是错误的,不能直接把集合名称填入collection=""

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

解决方法
1:在collection=""中填入list,框架会自行适配;
XML:

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

2:也可以在传入参数的时候使用@pram("")指定参数的名称,这样在xml中就能使用你指定的名称填入集合了
XML:

@MapKey("userId")
HashMap<Long,LookMyResumeUserInfoAndAuth> getResumeGuestUserInfo(@Param("userIds") List<Long> userIds);

Mapper:

<foreach collection="userIds" item="userId" open=" (" separator="," close=") " >
    #{userId}
</foreach>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值