一、问题描述:
在项目中使用到了DM数据库连接,查询某些数据,然后以Map形式返回时TEXT类型是会出现一些问题,默认会转换为dm.jdbc.driver.DmdbNClob类型的对象,某些情况下(不知道具体原因)在JSONObject.fromObject()里会导致循环依赖报错。
二、解决方案
1.我们可以在进行sql查询时就做一下转化。
原sql示例:
select text_col from dm_table;
这里查出来对应java中DmdbNClob类型的对象。
转换后的sql示例:
select convert(varchar, text_col ) AS text_col FROM dm_table;
这样查出来得就是字符串类型了。
2.如果是像select * from 查询,那么我们可以在配置数据源连接时设置下url的参数,如下:
url: jdbc:dm://192.168.5.125:5236?clobAsString=1
3.我们也可以在应用层对这种类型的数据特殊处理,如下:
Lis<Map<String,Object>> list = getDmData();
for(Map<String,Object> map : list){
Map<String, String> finalMap = new LinkedHashMap<>();
map.entrySet().stream().forEachOrdered(e -> {
if (e.getValue instanceof DmdbNClob){
DmdbNClob col = (DmdbNClob ) e.getValue;
finalMap.put(e.getKey(), col.data);
}else {
finalMap.put(e.getKey(), e.getValue());
}
}
这样就转换好了。
其中col.data可以通过源码就知道了。
进入DmdbClob类
其中有个data字段,就是我们要获取到的字符串。