Mybatis数据透视xml NumberFormatException“[”

问题描述 投票:0回答:1

我正在尝试使用 mybatis hub xml 创建一个变量列。就像下面的例子一样。 但是,如果包含字符串“[”(如下例所示),则会发生错误。 引起原因:java.lang.NumberFormatException:对于输入字符串:“test] 这是 Test1” Mybatis 选择 * FROM(选择工作 , 部门号 , 萨尔 来自员工 ) 枢轴 ( SUM(sal) FOR deptno IN ('[test] 这是 Test1','[test] 这是 Test2','[test] 这是 Test3') ) 按工作排序

在 Oracle DB 工具中正常工作 该现象仅发生在 Mybatis 内的查询中。

mybatis
1个回答
0
投票

当 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
© www.soinside.com 2019 - 2024. All rights reserved.