代码
/*Mapper*/
import org.apache.ibatis.annotations.Mapper;
import org.springframework.data.repository.query.Param;
@Mapper
public interface AdminUserMapper extends BaseMapperX<AdminUserDO> {
List<AdminUserDO> getUserListByRoles(@Param("roleIds") List<String> roleIds);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper">
<select id="getUserListByRoles" resultType="cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO">
SELECT
r.id as id, role.name as roleName
FROM
system_users r
LEFT JOIN system_user_role ur on ur.user_id = r.id
LEFT JOIN system_role role on ur.role_id = role.id
<where>
<if test="roleIds !=null and roleIds.size>0">
and role.code in
<foreach collection="roleIds" separator="," item="item" open="(" close=")">
#{item}
</foreach>
</if>
</where>
</select>
</mapper>
代码看上去完全没问题, 调用之后 直接报错 nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘roleIds’ not found.
fine~~ 好叭 查找下原因
排查原因
更改【1】
/*Mapper*/
import org.apache.ibatis.annotations.Mapper;
import org.springframework.data.repository.query.Param;
@Mapper
public interface AdminUserMapper extends BaseMapperX<AdminUserDO> {
List<AdminUserDO> getUserListByRoles( List<String> roleIds);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper">
<select id="getUserListByRoles" resultType="cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO">
SELECT
r.id as id, role.name as roleName
FROM
system_users r
LEFT JOIN system_user_role ur on ur.user_id = r.id
LEFT JOIN system_role role on ur.role_id = role.id
<where>
<if test="list !=null and list.size>0">
and role.code in
<foreach collection="list" separator="," item="item" open="(" close=")">
#{item}
</foreach>
</if>
</where>
</select>
</mapper>
ibatis默认使用list接受集合参数,如果不写参数指向 直接使用list 可行!
but,但是 如果需要传入多个参数 ,此法 又不行了。
说明不是根源所在呀。继续排查~~
更改【2】
经过仔细的检查, 发现!!! @Param 此注解引错包了!!! 就是这么离谱而又合理~~
我们需要使用的是ibatis框架中的@Param ,但是 却引入了 springframework框架中的@Param。🙃
引入org.apache.ibatis.annotations.Param 此路径下的才是正确的。
/*Mapper*/
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface AdminUserMapper extends BaseMapperX<AdminUserDO> {
List<AdminUserDO> getUserListByRoles(@Param("roleIds") List<String> roleIds);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.user.AdminUserMapper">
<select id="getUserListByRoles" resultType="cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO">
SELECT
r.id as id, role.name as roleName
FROM
system_users r
LEFT JOIN system_user_role ur on ur.user_id = r.id
LEFT JOIN system_role role on ur.role_id = role.id
<where>
<if test="roleIds !=null and roleIds.size>0">
and role.code in
<foreach collection="roleIds" separator="," item="item" open="(" close=")">
#{item}
</foreach>
</if>
</where>
</select>
</mapper>
测试后 ,此法可行。
总结
这是因为引错包路径而产生的错误。
使用ibatis框架时 在mapper里引入的@Param注解 归属于【org.apache.ibatis.annotations.Param;】