我在带有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
答案 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[]
之后,有一种使用java-stream的相当简单的方法:
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)