我正在尝试使用 mybatis hub xml 创建一个变量列。就像下面的例子一样。 但是,如果包含字符串“[”(如下例所示),则会发生错误。 引起原因:java.lang.NumberFormatException:对于输入字符串:“test] 这是 Test1” Mybatis 选择 * FROM(选择工作 , 部门号 , 萨尔 来自员工 ) 枢轴 ( SUM(sal) FOR deptno IN ('[test] 这是 Test1','[test] 这是 Test2','[test] 这是 Test3') ) 按工作排序
在 Oracle DB 工具中正常工作 该现象仅发生在 Mybatis 内的查询中。
当 1) 结果类型是
java.util.Map
或其子类且 2) 列标签包含括号 [
时,可能会发生这种情况。从MyBatis 3.5.16版本开始,你可以通过编写自定义使其工作
MapWrapper
。
这是一个示例实现。
import java.util.Map;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.factory.ObjectFactory;
import org.apache.ibatis.reflection.property.PropertyTokenizer;
public class FlatMapWrapper extends MapWrapper {
public FlatMapWrapper(MetaObject metaObject,
Map<String, Object> map, ObjectFactory objectFactory) {
super(metaObject, map);
}
@Override
public Object get(PropertyTokenizer prop) {
String key;
if (prop.getChildren() == null) {
key = prop.getIndexedName();
} else {
key = prop.getIndexedName() + "." + prop.getChildren();
}
return map.get(key);
}
@Override
public void set(PropertyTokenizer prop, Object value) {
String key;
if (prop.getChildren() == null) {
key = prop.getIndexedName();
} else {
key = prop.getIndexedName() + "." + prop.getChildren();
}
map.put(key, value);
}
}
要使用自定义
MapWrapper
,还需要编写自定义ObjectWrapperFactory
。
import java.util.Map;
import org.apache.ibatis.reflection.MetaObject;
public class MyObjectWrapperFactory implements ObjectWrapperFactory {
@Override
public boolean hasWrapperFor(Object object) {
return object instanceof Map;
}
@SuppressWarnings("unchecked")
@Override
public ObjectWrapper getWrapperFor(MetaObject metaObject, Object object) {
return new FlatMapWrapper(metaObject,
(Map<String, Object>) object, metaObject.getObjectFactory());
}
}
要注册自定义
ObjectWrapperFactory
,请将以下行添加到 XML 配置中。
<!-- fully qualified name of the custom object wrapper factory -->
<objectWrapperFactory type="pkg.MyObjectWrapperFactory" />
如果您使用的是 mybatis-spring-boot-starter,您可以将以下行添加到 application.properties 中。
mybatis.configuration.object-wrapper-factory=pkg.MyObjectWrapperFactory