解析所有列上的Array_agg

时间:2018-12-16 17:21:48

标签: java sql arrays jdbc java-8

我在带有Java-8的Ubuntu 10.6-1.pgdg18.04 + 1上使用PostgreSQL 10.6。我有两个桌子:

表测试

 Column |         Type         | 
--------+----------------------+
 id     | character varying(5) | 

表test2

 Column |         Type          | 
--------+-----------------------+---
 c1     | character varying(5)  |   
 c2     | character varying(10) |
 c3     | character varying(10) |
 c4     | character varying(10) |   

我正在尝试通过JOIN一次从两个表中获取结果。

这是我的查询

SELECT t1.*, Array_agg(t2.*) AS ent
FROM test AS t1 LEFT JOIN
     test2 AS t2
     ON t1.id = t2.c1 GROUP BY t1.id;

给出结果

 id |            ent            
----+---------------------------
 a  | {"(a,e,f,g)","(a,b,c,d)"}

获取值后输入列

Array arr = rs.getArray("ent");

Object objects = arr.getArray();

对象包含

objects = ["(a,e,f,g)","(a,b,c,d)"]

由于对象类型是对象,现在如何解析结果并将其作为单个值获取?

将其投射到ResultSet[]会得到cannot be cast to [Ljava.sql.ResultSet

3 个答案:

答案 0 :(得分:2)

据您所看到的问题,getArray方法返回一个Array的字符串。除了将Array强制转换为Object之外,您还可以将结果强制转换为字符串数组。

投放示例代码:

String[] arr = (String[])rs.getArray("ent");

一旦有了字符串数组,就可以使用字符串函数来解析和提取值。例如,如果在您的示例输入上执行了以下代码:

String[] arr = (String[])rs.getArray("ent");
    for(String row : arr) {
        String[] letters = row.replace("(","").replace(")","").split(",");
        for(String letter : letters) {
            System.out.println(letter);
        }
    }

应打印以下结果:

a
e
f
g
a
b
c
d

答案 1 :(得分:2)

将对象数组转换为String[]之后,有一种使用的相当简单的方法:

String[] arr = (String[]) rs.getArray("ent");

Arrays.stream(arr)                                             // array to Stream
      .map(string -> string.replaceAll("[()]", "").split(",")) // remove brackets and split
      .flatMap(Arrays::stream)                                 // flatten the array 
      .forEach(System.out::println);                           // print the letters out

如果要将新解析的项目添加到新数组String[]中,请将Stream::toArray与生成器一起使用以获取正确的数组类型:

String[] array = Arrays.stream(arr)
                       .map(string -> string.replaceAll("[()]", "").split(","))
                       .flatMap(Arrays::stream)
                       .toArray(String[]::new);

System.out.println(Arrays.asList(array));       // [a, e, f, g, a, b, c, d]

答案 2 :(得分:1)

要针对结果集中的每一行以String[][]的形式收集结果,您应该执行以下操作:

Arrays.stream((String[])rs.getArray("ent"))
    .map(element -> element.replaceAll("[()]", ""))
    .map(element -> element.split(","))
    .toArray(String[][]::new)