由于之前需要把一个集合的数据遍历查询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>