MyBatis - 在 foreach 中绑定参数
MyBatis - bind in foreach for parameter
我发现 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>
但是值总是取最后一个值。
我在参数 class 中创建了一个项目的扩展,它只包含所有方法:
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>
不太好,但有效。
我发现 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>
但是值总是取最后一个值。
我在参数 class 中创建了一个项目的扩展,它只包含所有方法:
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>
不太好,但有效。