我发现以下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>
但值始终采用最后一个值。
答案 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>
不太好,但有效。