The expression 'XXXX' evaluated to a null value

6 篇文章 0 订阅

方式1 传入map

将要传递的id都存到一个List中,将List存到要传参的map中,并给List一个键名,在collection中就配置这个键名,然后就能成功解析遍历了。

//使用<foreach>传入map集合,其中map中的值为对象做查询
        Map<String,Object> stuMap = new HashMap<>();

        List<Integer> stuList = new ArrayList<>();
        stuList.add(8);
        stuList.add(9);
        stuList.add(10);
        stuList.add(11);
        
        stuMap.put("stuList", stuList);

        List<Student> list3 = sd.findStudentList3(stuMap);
        System.out.println("用foreach传map值做查询:"+list3);
<!-- foreach实现in查询 -->
    <select id="findStudentList3" parameterType="map" resultMap="age">
        select * from student where id in
        <foreach collection="stuList" index="ind" item="ite" open="(" separator="," close=")">
            #{ite}
        </foreach>
    </select>
        
    <resultMap id="age" type="Student">
        <result column="stu_age" property="age" />
    </resultMap>

方式2 传入对象

传入对象,对象中有list

int queryTotal(InnerReconDaily reqDTO);

其中accNos是reqDTO中的list元素。

 <if test="accNos !=null and accNos.size()>0">
        and acc_no in
        <foreach collection="accNos" index="index" item="item" open="(" close=")" separator=",">
          #{item}
        </foreach>
      </if>

问题注意:当我添加另外一个参数(accNo == null or accNo = ‘’)的限制时,出错The expression ‘accNos’ evaluated to a null value;去掉后正常。目前原因还不太清楚。

 <if test="(accNo == null or accNo = '') and  accNos !=null and accNos.size()>0">
        and acc_no in
        <foreach collection="accNos" index="index" item="item" open="(" close=")" separator=",">
          #{item}
        </foreach>
      </if>

此外

在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可

以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key 下面分别来看看上述三种情况的示例代码:
1.单参数List的类型:

 <select id="dynamicForeachTest" resultType="Blog">
          select * from t_blog where id in
       <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
               #{item}       
       </foreach>    
   </select>

若传入的是List类型 在Mapper文件中处理过后,SQL如下:(直接引用注解中的参数名字,这样mybatis会忽略类型,按名字引入)

 <select id="dynamicForeachTest" resultType="Blog">
          select * from t_blog where id in
       <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
               #{item}       
       </foreach>    
   </select>

上述collection的值为list,对应的Mapper是这样的
public List dynamicForeachTest(List ids);

若是传入的是的是List类型的 可能会报出两个参数的异常,这时我们可以用Mybatis官方的注解@Param

public List dynamicForeachTest(@Param(“ids”)List ids);

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值