如何从具有多行的 SQL 查询中获取非字符串数组字段

Posted

技术标签:

【中文标题】如何从具有多行的 SQL 查询中获取非字符串数组字段【英文标题】:How can i get non String Array field from SQL query with multiple rows 【发布时间】:2018-01-09 15:46:12 【问题描述】:

我有带有 VALS DOUBLE ARRAY[2000] 字段的 SQL (HSQLDB) 表 我使用返回带有VALS字段的多行的查询 如果我尝试将数组作为

Array array = rs.getArray("VALS");
Double[] vals = (Double[]) array.getArray();

我明白了

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Double;

我可以通过从 Object 到 String 的双重转换然后将 String 解析为 Double 来获取值,例如:

List<Double> values = new ArrayList<Double>();
for (Object o: (Object[])array.getArray()) 
    values.add(Double.parseDouble(o.toString()));

但看起来开销很大

有没有什么方法可以在不进行字符串转换或多个单行查询的情况下从 Array SQL 字段中获取数字?在调试器中 rs.getArray() 向我展示了一个完美的数字值 JDBCArray ARRAY[0.0E0,0.0E0,0.0E0,0.0E0,0.0E0 .... ]

【问题讨论】:

【参考方案1】:

您不需要转换为字符串并返回。刚投:

List<Double> values = new ArrayList<Double>(); 
for (Object o: (Object[])array.getArray()) 
    values.add((Double) o); 

【讨论】:

【参考方案2】:

试试下面的代码:

Double[] vals = Arrays.stream(array.getArray()) .map(Double::valueOf) .toArray(Double[]::new);

【讨论】:

未解决的编译问题:数组类型中的方法流(T[])不适用于参数(对象)如果我将强制转换添加到 Double[],我会得到与开头相同的异常,如果我转换为 Object[] ,则得到未解决的编译问题:无法推断 map(Function super T,? extends R>) 的类型参数

以上是关于如何从具有多行的 SQL 查询中获取非字符串数组字段的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询以获取具有不同时间戳的多行

在SQL中如何从数组中获取值再进行查询

如何在 SQL 子查询中获取字符串数组

PHP如何将SQL查询结果转为多维数组,并按查询行输出

如何在从多个表中获取多行的同时删除 sql JOIN 中的重复项

从数据数组(php,mysql)编写循环sql查询