MyBatis是否支持使用字符串替换${}而不是准备好的语句替换#{}指定类型处理程序?
我试图用枚举值填充一个order by子句,所以我为此使用了一个TypeHandler,但是我无法让它工作。
EnumTypeHandler
public class EnumTypeHandler implements TypeHandler<MyEnum> {
@Override
public void setParameter(PreparedStatement ps, int i, MyEnum parameter,
JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter.getValue());
}
@Override
public MyEnum getResult(ResultSet rs, String columnName) throws SQLException {
// Not implemented
return null;
}
@Override
public MyEnum getResult(ResultSet rs, int columnIndex) throws SQLException {
// Not implemented
return null;
}
@Override
public MyEnum getResult(CallableStatement cs, int columnIndex) throws SQLException {
// Not implemented
return null;
}
}MyBatis XML
order by ${searchCriteria.sortBy, typeHandler=com.example.EnumTypeHandler}误差
org.apache.ibatis.binding.BindingException: Parameter 'com' not found. Available parameters are [offset, searchCriteria, limit, param3, param1, param2]发布于 2021-11-14 17:33:05
我相信字符串替换只是根据我的经验调用toString()。虽然如果您只想通过使用枚举指定要排序的列,但实际上不需要类型处理程序。使枚举名称与可能的列名相匹配应该可以。或者,如果希望代码中有更多可读的名称,则可以重写枚举的toString()以返回实际的列名。
不久前,我想使用枚举进行排序,因为${}只调用toString(),所以我只是重写了方法来返回列名,并将枚举放在没有任何类型处理程序的替换中。
这是非常简单的,但为了完整起见,这里基本上是我所做的。
public class Constants {
public enum SortFields {
REQUEST_DATE("REQ_DT"), ID_NUMBER("ID"), MEMBER_NAME("MEM_NM");
private final String columnName;
SortFields(String columnName) {
this.columnName = columnName;
}
public String getColumnName() {
return columnName;
}
public boolean equalsColumnName(String comparedColumnName) {
return columnName.equals(comparedColumnName);
}
@Override
public String toString() {
return columnName;
}
}
}把枚举传递给了一个${}。如果枚举名只是列名,而不是拼写出来的,那么重写toString()可能是不必要的。
https://stackoverflow.com/questions/67992364
复制相似问题