MyBatis - 在foreach中绑定参数

时间:2015-03-27 08:58:38

标签: java binding foreach mybatis

我发现以下mybatis问题: SQL parameter substitution functionality differs substantially from string substitution functionality

是否存在变通方法,例如。在#{} 表达式中使用java代码(静态方法?)?

我需要创建以下声明:

<foreach item="c" collection="filter.getFilter()" separator=" AND " open="(" close=")">
    <bind name="column" value="_parameter.mappingWhere(c.colCode)"/>
    <bind name="operator" value="_parameter.conditionOperator(c.condition)"/>
    <bind name="value" value="_parameter.conditionValue(c.condition, c.value)"/>
        ${column} ${operator} #{value}
</foreach>  

始终采用最后一个值。

1 个答案:

答案 0 :(得分:0)

我在参数类中创建了一个项目的扩展,它只包装了所有方法:

    class MyItem extends Item {

    public MyItem (Item pxFilterItem) {
        super();
        setColCode(pxFilterItem.getColCode());
        setColHeader(pxFilterItem.getColHeader());
        setCondition(pxFilterItem.getCondition());
        setJsonCls(pxFilterItem.getJsonCls());
        setJsonValue(pxFilterItem.getJsonValue());
        setValue(pxFilterItem.getValue());
    }

    public String getSqlColumn(){
        return mappingWhere((String) getColCode());
    }

    public String getSqlOperator(){
        return conditionOperator(getCondition());
    }

    public Object getSqlValue(){
        return conditionValue(getCondition(), getValue());
    }
}

,在执行查询之前用新的对象替换原始对象:

    List<Item> myList = new ArrayList<Item>();
    for (Item item: filter.getFilter()) {
        MyItem myItem = new MyItem(item);
        myList.add();
    }
    this.filter.setFilter(myList);

并重写了查询:

        <foreach item="c" collection="filter.getFilter()" separator=" AND " open="(" close=")">
            ${c.sqlColumn} ${c.sqlOperator} #{c.sqlValue}
        </foreach>            

不太好,但有效。