Postgresql array_agg 多列与 JDBC

标签 postgresql jdbc aggregate-functions

我正在尝试加入一个可能具有给定 id 的多个条目的表,并将与该 id 对应的行聚合到一个数组中。 SQL 查询如下所示:

SELECT * from data
LEFT JOIN (select id, array_agg(row(foo, bar)) AS foo_bar_data from foo_bar_table group by id) AS temp using(id)

这按预期工作,但我在 JDBC 中读出结果时遇到问题。

ResultSet rs = st.executeQuery(...)
Array a = rs.getArray("foo_bar_data")
// Now I want to iterate over the array, reading the values foo and bar of each item.

到目前为止,我的努力总是以 Method org.postgresql.jdbc4.Jdbc4Array.getArrayImpl(long,int,Map) is not Yet Implemented. 异常结束。如何迭代 a,检索值 foobar

编辑:我可能还应该提到,foobar 没有相同的类型。

最佳答案

Postgres JDBC 驱动程序不支持除基本类型(数字、日期/时间戳、字符串)以外的任何 JDBC 数组。您可以调用 array_agg 两次并在每行获取两个数组:

    try (Connection db = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "postgres");
                 ResultSet rs = db.createStatement().executeQuery("select array_agg(i), array_agg(s) from (select 1 i, 'a' s union select 2 i, 'b' s) t")) {
        rs.next();
        System.out.println(Arrays.toString((Object[]) rs.getArray(1).getArray()));
        System.out.println(Arrays.toString((Object[]) rs.getArray(2).getArray()));
    }

关于Postgresql array_agg 多列与 JDBC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32016829/

相关文章:

sql - PostgreSQL:删除行和其他行并引用已删除的行

java - 将基本数据源与连接池数据源混合在一起 : when to call close()?

C# SQL 聚合 ExecuteScalar 返回查询

postgresql - 不使用 PostgreSQL 检索 Entity Framework Core 中的相关表数据

postgresql - 当pq_user中的valuntil值为NULL时,PostgreSQL用户密码多久会过期?

sql - 如何使用 max() 函数使用 SQL/postgreSQL 检索最新行

mysql - 加载类 `com.mysql.jdbc.Driver' 。这已被弃用。新的驱动程序类是 `com.mysql.cj.jdbc.Driver'

java - Android Studio 中与 Azure 的 JDBC 连接失败

sql - 带有 LIMIT 的 PostgreSQL 窗口函数

MYSQL - 多个计数语句