现象为:
之前获取对象后,如果对象的属性为null,获取到的值就是null。但是,使用了sharding-jdbc后,如果为null的属性类型为Integer或者Long等等,获取到的值就变成了0。String等类型不受影响。
这个问题是在使用了sharding-jdbc后出现的。Sharding-jdbc的版本为4.1.0。
对整个查询流程进行debug后,发现在当获取的结果为null时,会被org.apache.shardingsphere.shardingjdbc.jdbc.core.resultset.ResultSetUtil中的方法进行转换处理。
/** * Convert value via expected class type. * * @param value original value * @param convertType expected class type * @return converted value */ public static Object convertValue(final Object value, final Class<?> convertType) { if (null == value) { return convertNullValue(convertType); } if (value.getClass() == convertType) { return value; } if (value instanceof Number) { return convertNumberValue(value, convertType); } if (value instanceof Date) { return convertDateValue(value, convertType); } if (value instanceof byte[]) { return convertByteArrayValue(value, convertType); } if (String.class.equals(convertType)) { return value.toString(); } else { return value; } } private static Object convertNullValue(final Class<?> convertType) { switch (convertType.getName()) { case "boolean": return false; case "byte": return (byte) 0; case "short": return (short) 0; case "int": return 0; case "long": return 0L; case "float": return 0F; case "double": return 0D; default: return null; } }
目前没有发现sharding-jdbc有何配置可以关闭该转换,所以只能尽量保证数据库中数据不为null。