Postgresql array_agg dari beberapa kolom dengan JDBC

Saya mencoba menggabungkan tabel yang mungkin memiliki banyak entri untuk id tertentu dan menggabungkan baris yang sesuai dengan id ini dalam sebuah array. Ini terlihat sebagai berikut dalam kueri 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)

Ini berfungsi sebagaimana mestinya, tetapi saya kesulitan membaca hasilnya di 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.

Usahaku selama ini selalu berakhir dengan Method org.postgresql.jdbc4.Jdbc4Array.getArrayImpl(long,int,Map) is not yet implemented. pengecualian. Bagaimana cara mengulangi a, mengambil nilai foo dan bar?

Sunting: Saya mungkin juga harus menyebutkan, bahwa foo dan bar tidak memiliki tipe yang sama.


person panmari    schedule 14.08.2015    source sumber
comment
Apa versi server dan driver pg?   -  person Radek Postołowicz    schedule 14.08.2015
comment
Server menggunakan 8.4.9 dan sebagai driver saya menggunakan postgresql-9.4-1201.jdbc41.jar   -  person panmari    schedule 14.08.2015
comment
Bisakah Anda memposting kueri lengkap yang Anda gunakan (atau setidaknya bagian SELECT, yang mencerminkan ResultSet).   -  person Mick Mnemonic    schedule 15.08.2015


Jawaban (1)


Driver Postgres JDBC tidak mendukung apa pun kecuali tipe dasar (angka, tanggal/cap waktu, string) sebagai array JDBC. Anda dapat memanggil array_agg dua kali dan mendapatkan dua array di setiap baris:

    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()));
    }
person sibnick    schedule 15.08.2015
comment
Saya tidak mengerti cara kerja kueri ini. Bisakah Anda menjelaskan sedikit dan mungkin menggunakan nama kolom yang sama seperti saya? Selain itu, saya menyebutkan dalam jawaban saya bahwa foo dan bar tidak memiliki tipe yang sama, e. G. resp string. bilangan bulat. Apakah ini masih berfungsi, karena saya melihat Anda memasukkan semuanya ke array Integer? - person panmari; 15.08.2015
comment
Oke. Saya memahami masalah Anda. postgres JDBC tidak mendukung array campuran. Anda dapat memilih dua kolom: larik angka, dan larik string. - person sibnick; 15.08.2015
comment
Jadi bagaimana saya bisa melakukannya jika saya memasukkan semuanya ke string dalam kueri? - person panmari; 15.08.2015
comment
Anda dapat menulis: SELECT * from data LEFT JOIN (select id, array_agg(row(foo, bar)::text) AS foo_bar_data dan Anda akan mendapatkan String[] seperti [(1,a), (2,b)], di mana (1,a) adalah satu string. Tapi kenapa tidak mau menggunakan dua kolom/array? - person sibnick; 15.08.2015
comment
Itulah solusi yang saya gunakan saat ini, lalu saya parsing string di java (sangat jelek). Ya, saya lebih suka mendapatkan kedua nilai ini satu per satu. Apa yang Anda maksud dengan memilih dua kolom? Memanggil array_agg dua kali, sekali dengan kolom string dan sekali dengan kolom int? - person panmari; 15.08.2015
comment
Ya, panggil array_agg dua kali - person sibnick; 15.08.2015
comment
Oke, menurut jawaban ini, nilai yang sesuai akan diurutkan sama di kedua array, yang mana akan cukup untuk saya gunakan. Bisakah Anda mengedit jawaban Anda sedikit, saya akan menerimanya. - person panmari; 15.08.2015