MyBatis @Update与foreach有关

时间:2018-01-30 23:28:46

标签: java mysql mybatis spring-mybatis

我使用myBatis。单个记录语句工作正常,但是当我尝试使用foreach来执行记录列表的更新时,由于它对单个记录工作正常,因此发生了一些有点奇怪的错误。

@Update("UPDATE table SET field_one=#{input.fieldOne} WHERE field_two =#{input. fieldTwo}")
    public void updateDomain(@Param("input") ObjectList input);

@Update({"<script>",
        "<foreach item='item' index='index' collection='input' separator=','>",
        "UPDATE table",
        "SET field_one = '#{item.fieldOne}'",
        "WHERE field_two = '#{item.fieldTwo}'", 
        "</foreach> ",
        "</script>"})
public void updateDomains(@Param("input") List<ObjectList> input);

这是我得到的错误:

  

引起:org.apache.ibatis.type.TypeException:无法设置映射参数:ParameterMapping {property ='__ frch_item_0.fieldOne',mode = IN,javaType = class java.lang.String,jdbcType = null, numericScale = null,resultMapId ='null',jdbcTypeName ='null',expression ='null'}。原因:org.apache.ibatis.type.TypeException:使用JdbcType null为参数#1设置非null时出错。尝试为此参数或其他配置属性设置不同的JdbcType。原因:java.sql.SQLException:参数索引超出范围(1>参数个数,即0)。       在org.apache.ibatis.scripting.defaults.DefaultParameterHandler.setParameters(DefaultParameterHandler.java:89)       at org.apache.ibatis.executor.statement.PreparedStatementHandler.parameterize(PreparedStatementHandler.java:93)       引发者:org.apache.ibatis.type.TypeException:使用JdbcType null为参数#1设置非null时出错。尝试为此参数或其他配置属性设置不同的JdbcType。原因:java.sql.SQLException:参数索引超出范围(1>参数个数,即0)。       at org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:55)       在org.apache.ibatis.scripting.defaults.DefaultParameterHandler.setParameters(DefaultParameterHandler.java:87)       ...省略了45个常见帧   引起:java.sql.SQLException:参数索引超出范围(1&gt;参数个数,为0)。

1 个答案:

答案 0 :(得分:0)

实际上它应该是语法tyopo;而不是,对于分隔符。这是可行的例子。

@Update({ "<script>",
            "<foreach item='item' index='index' collection='collectionToUpdate' separator=';'>",
            "UPDATE domains",
            "SET columnOne =  #{item.valueOne} WHERE columnTwo = #{item.valueTwo}", 
            "</foreach> ",
            "</script>"})