In realtà ho contattato gli sviluppatori JDBC su Github e dopo alcune discussioni sembra che attualmente la soluzione migliore sia avere la dichiarazione preparata come segue:
String query = "SELECT id, data FROM table_name WHERE data->'objects' @> ?::jsonb";
e passare l'intero criterio di ricerca come oggetto JSON stringato per il parametro:
PreparedStatement st = connection.prepareStatement(query);
st.setString(1, "[\"id\":" + "id1" + "]");
st.executeQuery();
non è una soluzione perfetta ma sembra la migliore possibile a causa della mancanza di capacità del server. Alla fine non è così male in quanto (teoricamente) non c'è alcun rischio di SQL injection.
Maggiori dettagli sul problema Github collegato.