David Oh
David Oh

Reputation: 23

foreach injection is not working in mybatis

Plz help me inject tag into @Delete query.

@Delete({"<script>","${__sql}","</script>"})
public int Delete(String __sql, List<Map<String, Object>> list);

__sql :

DELETE FROM MYTABLE WHERE KEY IN (<foreach collection='list' item='item' seperator=','> #{item.key} </foreach>)

I got error below:

Caused by: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'item' not found. Available parameters are [__sql, list, param1, param2]

Upvotes: 0

Views: 590

Answers (1)

ave
ave

Reputation: 3594

Tags in ${} are not evaluated.
You need to use SQL provider with @Lang instead.

public interface YourMapper {
  @Lang(XMLLanguageDriver.class)
  @DeleteProvider(type = YourSqlProvider.class, method = "deleteSql")
  int Delete(String sql, List<Map<String, Object>> list);

  class YourSqlProvider {
    public String deleteSql(String sql) {
      return "<script>" + sql + "</script>";
    }
  }
}

This requires MyBatis 3.5.1 or newer, IIRC.

Upvotes: 2

Related Questions