PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

selecione para atualização com JDBC?


Você primeiro adiciona for update para o seu select (e suas outras colunas que você deseja atualizar) e, em seguida, você as atualiza. Além disso, conforme observado nos comentários, certifique-se de que seu getConnection retorna uma Connection sem autocommit. E você precisa definir uma Statement tipo para rolagem e CONCUR_UPDATABLE . Algo como,
String[] colNames = { "email", "already_linked", "account_link_timestamp" };
String query = "select " + Stream.of(colNames).collect(Collectors.joining(", "))
        + "from email_accounts where already_linked = false for update";
try (Connection conn = getConnection(); // Make sure conn.setAutoCommit(false);
        Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, 
                ResultSet.CONCUR_UPDATABLE);
        ResultSet rs = stmt.executeQuery(query)) {
    while (rs.next()) {
        // Get the current values, if you need them.
        String email = rs.getString(colNames[0]);
        boolean linked = rs.getBoolean(colNames[1]);
        Timestamp time = rs.getTimestamp(colNames[2]);
        // ...
        rs.updateBoolean(colNames[1], true);
        rs.updateTimestamp(colNames[2], //
                new Timestamp(System.currentTimeMillis()));
        rs.updateRow();
    }
} catch (SQLException e) {
    e.printStackTrace();
}