Mapper层到XML层传输数组和字符串Parameter ‘XXX‘ not found. Available parameters are [arg1, arg0, param1, param2]

文章讲述了如何在业务需求变化下,调整通知系统的SQL查询,以实现按部门权限过滤通知。涉及到前端添加部门选择、mapper层参数处理、以及MySQL参数映射的最佳实践。最终通过将多个参数合并为一个map对象并利用动态SQL解决数组长度判断问题。
摘要由CSDN通过智能技术生成

业务需求

是通知和公告的功能用到这块,之前通知和公告是任何人都可以查到全部的,现在通知这块需要具体到部门,比如研发部看不到对于人事部的通告。但是研发部和人事部同属于杭州子公司,针对于杭州子公司发布的通知两个部门都可以看到

逻辑分析

在前端添加公告时新增一个部门树绑定部门ID号

实现核心使用树的思想+递归来绑定成为一个部门树

过滤出符合能看的通知逻辑(参考下图好理解)

  1. 总公司
  2. 杭州子公司
  3. 研发部门

现在我对杭州子公司发送通知:那么可以看到的部门是(66、55、44、60、50)
如果我对杭州子公司的研发部门发送通知:那么可以看到的部门是(66、55、44、50)
由此可以推出来这个逻辑:通告到的部门+通告到的部门下的所有子节点(直到叶子节点)+通告到的部门的父节点(父节点的父节点,直到根节点)
实现方式和上面部门树差不多,而且不用去构建树,符合就添加到数组就可以啦

问题

在mapper层往xml文件调用sql时会存在两个参数(noticeType:通知/公告(String)、deptIds:过滤出来符合的部门ID(Long[])

通过在mapper层使用@Param注解

    /**通过类型查询列表*/
    List<SysNotice> selectNoticeListByType(@Param("noticeType") String noticeType,@Param("ids") Long[] ids);
<select id="selectNoticeListByType" resultMap="SysNoticeResult">
        <include refid="selectNoticeVo"/>
        <where>
            <if test="noticeType != null and noticeType != ''">
                AND notice_type = #{noticeType}
            </if>
            <if test="ids != null and ids != ''">
                AND notice_dept_id in
                <foreach collection="ids" item="noticeDeptId" open="(" separator="," close=")">
                    #{noticeDeptId}
                </foreach>
            </if>
        </where>
        order by order_flag, create_time desc
    </select>

错误原因可以看出来是@Param注解中的参数没有获取到
因为之前这个接口只有一个参数noticeType是没有任何问题的,所以可以定位到就是这个数组加进来的问题,那这样就把第一个参数去掉,看看第二个参数自己有没有问题

细心的同学可以看到mysql中参数并不是按照我们注解@param来对应上去的,然后有个大佬讲的

  1. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array 
  2. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list 

collection属性的值就是我们数据的来源
将collection属性的值换做array结果就成功啦,sql也是正确的过滤条件

既然@Param不生效,那我们就不传两个参数,我们传一个对象(map对象,map的key就是@param的属性值),将需要的数据封装传过去(动态sql中if标签并不支持判断一个数组的长度,如果数组没有数据(公告类型)那么会查不出来数据,所以通过带过去一个数组的长度来判断)

    Map<String, Object> map = new HashMap<>();
    map.put("noticeType", type);
    map.put("ids", deptList);
    map.put("idsLen", deptList.length);
    return noticeMapper.selectNoticeListByType(map);

换个账号登录OVER

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小张不嚣张Demo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值