如何从HSQLDB多行SQL查询中高效获取DOUBLE ARRAY字段
解决HSQLDB DOUBLE ARRAY字段高效取值的问题
这个问题我之前也碰到过,HSQLDB的JDBC驱动在处理DOUBLE数组时,确实会返回Object[]而不是Double[],直接强转就会触发ClassCastException——其实数组里的元素本身就是Double类型,只是数组的类型是Object[],所以根本没必要走字符串转换那套低效的路子!
高效方案1:直接强转数组元素
既然数组里的每个元素本质上就是Double,你可以直接把Object强转为Double,省去字符串解析的开销:
Array array = rs.getArray("VALS"); Object[] objArray = (Object[]) array.getArray(); Double[] vals = new Double[objArray.length]; for (int i = 0; i < objArray.length; i++) { vals[i] = (Double) objArray[i]; // 直接强转,无需字符串转换 }
如果用ArrayList收集的话,代码更简洁:
List<Double> values = new ArrayList<>(objArray.length); for (Object o : objArray) { values.add((Double) o); }
高效方案2:用Arrays.copyOf批量转换
如果你需要直接得到Double[]数组,可以用Arrays.copyOf方法一次性完成数组类型转换,底层基于数组拷贝,效率和手动循环相当:
Array array = rs.getArray("VALS"); Object[] objArray = (Object[]) array.getArray(); Double[] vals = Arrays.copyOf(objArray, objArray.length, Double[].class);
为什么字符串转换完全没必要?
调试时你看到的ARRAY[0.0E0,0.0E0,...]只是JDBCArray的toString输出,实际数组里存储的是原生的Double对象,不是字符串。转字符串再解析完全是多此一举,尤其是数组长度达到2000的时候,会带来明显的性能损耗。
额外建议:检查HSQLDB驱动版本
如果你的驱动版本比较旧,可以尝试升级到最新的HSQLDB JDBC驱动(比如2.7.x及以上版本),新版本可能优化了数组类型的返回逻辑,说不定能直接返回Double[],这样就不用额外转换了。
内容的提问来源于stack exchange,提问作者Stanislav Orlov
相关产品推荐
相关产品推荐

