我正在尝试在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>
我真的不知道我错过了什么。
我已经尽力了..
请帮助我解决这个问题。
答案 0 :(得分:0)
根据mybatis documentation:
使用地图(或Map.Entry对象的集合)时,索引将为 关键对象和项目将是值对象
这意味着当您将地图作为参数传递给foreach
时,循环将遍历地图值。根据您的情况,您必须拥有键proj_no
,task_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
包含一个带有键Map
,proj_no
等的task_name
,则您的代码将起作用,因为在这种情况下, item
循环将是整个地图。如果您只需要传递一张地图,则不需要foreach
,请执行以下操作:
foreach