Ik heb eigenlijk contact opgenomen met JDBC-ontwikkelaars via Github en na wat discussies lijkt het erop dat momenteel de beste oplossing is om de voorbereide verklaring als volgt te hebben:
String query = "SELECT id, data FROM table_name WHERE data->'objects' @> ?::jsonb";
en geef de hele zoekcriteria door als stringified JSON-object voor de parameter:
PreparedStatement st = connection.prepareStatement(query);
st.setString(1, "[\"id\":" + "id1" + "]");
st.executeQuery();
dat is geen perfecte oplossing, maar lijkt de best mogelijke vanwege een gebrek aan servermogelijkheden. Uiteindelijk valt het mee, want er is (theoretisch) geen risico op SQL-injectie.
Meer details over het gekoppelde Github-probleem.