今天遇到一个问题,在执行select
操作时报错,排查出来是json_remove()函数在不同数据库有区别。
描述
sql语句是:
select json_data, json_remove(json_data,'$.data') AS
json_remove from table_xxx
查询一个json结构的数据。
在Java中,使用List<Map<String, Object>>
类型接查询结果,然后做后续操作。
问题
部分测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| List<Map<String, Object>> list = jdbcTemplate.queryForList(sql); Map<String, String> type = new HashMap(); for (Map<String, Object> map : list) { Object jsonDateObject = map.get("json_data"); if (jsonDateObject instanceof String) { type.put("jsonDate", "String"); } else if (jsonDateObject instanceof byte[]) { type.put("jsonDate", "byte[]"); } else { type.put("jsonDate", "other"); } Object jsonRemoveObject = map.get("json_remove"); if (jsonRemoveObject instanceof String) { type.put("jsonRemove", "String"); } else if (jsonRemoveObject instanceof byte[]) { type.put("jsonRemove", "byte[]"); } else { type.put("jsonRemove", "other"); } break; } String v = ""; sql = "select VERSION() as v"; list = luckySheetJdbcTemplate.queryForList(sql); for (Map<String, Object> map : list) { Object vObject = map.get("v"); v = vObject.toString(); } type.put("dbVersion", v); return type.toString();
|
在不同数据库上的查询结果:
MariaDb:
1 2 3 4 5
| { "dbVersion": "10.3.23-MariaDB-0+deb10u1", "jsonData": "String", "jsonRemove": "byte[]" }
|
MySQL:
1 2 3 4 5
| { "dbVersion": "5.7.26", "jsonData": "String", "jsonRemove": "String" }
|
TdSQL:
1 2 3 4 5
| { "dbVersion": "5.7.35-V2.0R681D005-v17-20210125-2111-log", "jsonData": "String", "jsonRemove": "String" }
|
结论
通过测试,json_remove()
函数在不同数据库的返回值类型是有区别的,在工程中需要注意。