无法在mybatis foreach中绑定参数

时间:2018-07-24 08:29:59

标签: java foreach mybatis

我正在尝试在mybatis foreach中绑定多个参数,该参数昨晚效果很好。
这是我的代码

<insert id="insertWbs" parameterType="HashMap"> 
    <if test="paramList.size != 0">
        BEGIN
            <foreach collection="paramList" item="item" separator=";">
                insert into wbs(proj_no, task_name, wbs_worker, wbs_tester, wbs_ex_start, wbs_ex_end, wbs_unique, task_status, wbs_parent)
                    select #{item.proj_no}, #{item.task_name}, #{item.wbs_worker}, #{item.wbs_tester}, to_date(#{item.wbs_ex_start}, 'yyyy-mm-dd'), to_date(#{item.wbs_ex_end}, 'yyyy-mm-dd'), #{wbs_unique}, #{item.task_status}, #{item.wbs_parent} from dual where not exists
                    (select wbs_unique from wbs where wbs_unique = #{wbs_unique})
            </foreach>;
        END;
    </if>
</insert>
大家看到的

参数类型是HashMap,集合paramList是映射中的键之一。
现在这段代码会引发这样的错误

There is no getter for property named 'proj_no' in 'class java.lang.String'

奇怪的是,它昨晚运转良好。即使运行在相同逻辑上的代码仍然可以正常工作。

<update id="updateWbs" parameterType="HashMap">
    <if test="paramList.size != 0">
    BEGIN
        <foreach collection="paramList" item="item" separator=";">
            <if test="#{item.wbs_start} != null and #{item.wbs_end} != null">
                update wbs set task_name = #{item.task_name}, wbs_worker = #{item.wbs_worker}, wbs_tester = #{item.wbs_tester}, task_status = #{item.task_status}, wbs_start = to_date(#{item.wbs_start}, 'yyyy-mm-dd'), wbs_end = to_date(#{item.wbs_end}, 'yyyy-mm-dd')    
                where wbs_unique = #{item.wbs_unique} 
            </if>

            <if test="#{item.wbs_start} != null and #{item.wbs_end} == null">
                update wbs set task_name = #{item.task_name}, wbs_worker = #{item.wbs_worker}, wbs_tester = #{item.wbs_tester}, task_status = #{item.task_status}, wbs_start = to_date(#{item.wbs_start}, 'yyyy-mm-dd')    
                where wbs_unique = #{item.wbs_unique} 
            </if>

            <if test="#{item.wbs_start} == null and #{item.wbs_end} != null">
                update wbs set task_name = #{item.task_name}, wbs_worker = #{item.wbs_worker}, wbs_tester = #{item.wbs_tester}, task_status = #{item.task_status}, wbs_end = to_date(#{item.wbs_end}, 'yyyy-mm-dd')    
                where wbs_unique = #{item.wbs_unique} 
            </if>

            <if test="#{item.wbs_start} == null and #{item.wbs_end} == null">
                update wbs set task_name = #{item.task_name}, wbs_worker = #{item.wbs_worker}, wbs_tester = #{item.wbs_tester}, task_status = #{item.task_status}    
                where wbs_unique = #{item.wbs_unique} 
            </if>
        </foreach>;
    END;
    </if>
</update>

我真的不知道我错过了什么。 我已经尽力了..
请帮助我解决这个问题。

1 个答案:

答案 0 :(得分:0)

根据mybatis documentation

  

使用地图(或Map.Entry对象的集合)时,索引将为   关键对象和项目将是值对象

这意味着当您将地图作为参数传递给foreach时,循环将遍历地图值。根据您的情况,您必须拥有键proj_notask_name等,其键值为字符串:

{
  'proj_no' -> 'some-project-number',
  'task_name' -> 'some-task-name',
  // and so on
}

如果将Map传递给foreach,则item将在第一次迭代中使用some-project-number,在第二次迭代中使用some-task-name,依此类推。 #{item.proj_no}尝试从名称为proj_no的对象获取属性。而且因为它是一个字符串,所以无法找到并在错误消息中显示出来。

如果您传递的List包含一个带有键Mapproj_no等的task_name,则您的代码将起作用,因为在这种情况下, item循环将是整个地图。如果您只需要传递一张地图,则不需要foreach,请执行以下操作:

foreach