Get RETURNING value from Postgresql via Java

后端 未结 4 550
长发绾君心
长发绾君心 2020-12-19 03:28

From Java, I\'m calling a prepared statement in Postgresql with an insert that has a RETURNING clause for my identity column. In PG admin it comes right back, but not sure

相关标签:
4条回答
  • 2020-12-19 03:35

    According to the javadoc, PreparedStatement inherits from Statement and the latter contains a getResultSet() method. In other words, try this:

    String insertStatement = "INSERT INTO person(\n" +
                    "            name, address, phone, customer_type, \n" +
                    "            start_dtm)\n" +
                    "    VALUES (?, ?, ?, ?, \n" +
                    "            ?)\n" +
                    "    RETURNING person_id;";
    
    
    PreparedStatement stmt = connection.prepareStatement(insertStatement);
    
    stmt.setObject(1, perToSave.getName(null));
    stmt.setObject(2, editToSave.getAddress());
    stmt.setObject(3, editToSave.getPhone());
    stmt.setObject(4, editToSave.getCustType());
    long epochTime = java.lang.System.currentTimeMillis();
    stmt.setObject(5, new java.sql.Date(epochTime));
    
    stmt.executeUpdate();
    ResultSet last_updated_person = stmt.getResultSet();
    last_updated_person.next();
    int last_updated_person_id = last_updated_person.getInt(1);
    

    Leave a comment if you have further issues.

    0 讨论(0)
  • 2020-12-19 03:36

    I do not have enough reputation to Comment and my Edit got rejected, so sorry for re-posting the already accepted answer from hd1.

    executeUpdate expects no returns; use execute. Check if there is some results before trying to retrieve the value.

    String insertStatement = "INSERT INTO person(\n" +
                    "            name, address, phone, customer_type, \n" +
                    "            start_dtm)\n" +
                    "    VALUES (?, ?, ?, ?, \n" +
                    "            ?)\n" +
                    "    RETURNING person_id;";
    
    PreparedStatement stmt = connection.prepareStatement(insertStatement);
    
    stmt.setObject(1, perToSave.getName(null));
    stmt.setObject(2, editToSave.getAddress());
    stmt.setObject(3, editToSave.getPhone());
    stmt.setObject(4, editToSave.getCustType());
    long epochTime = java.lang.System.currentTimeMillis();
    stmt.setObject(5, new java.sql.Date(epochTime));
    
    stmt.execute();
    ResultSet last_updated_person = stmt.getResultSet();
    if(last_updated_person.next()) {
       int last_updated_person_id = last_updated_person.getInt(1);
    }
    
    0 讨论(0)
  • 2020-12-19 03:36

    JDBC has built-in support for returning primary key values for insert statements. Remove the "returning" clause from your SQL and specify PreparedStatement.RETURN_GENERATED_KEYS as a second parameter to your prepareStatment(...) call. Then you can get the generated primary key by calling stmt.getGeneratedKeys() on your PreparedStatement object after calling executeUpdate().

    String insertStatement = "INSERT INTO person(\n" +
        "            name, address, phone, customer_type, \n" +
        "            start_dtm)\n" +
        "    VALUES (?, ?, ?, ?, \n" +
        "            ?)";
    
    PreparedStatement stmt = connection.prepareStatement(insertStatement,
        PreparedStatement.RETURN_GENERATED_KEYS);
    
    stmt.setObject(1, perToSave.getName(null));
    stmt.setObject(2, editToSave.getAddress());
    stmt.setObject(3, editToSave.getPhone());
    stmt.setObject(4, editToSave.getCustType());
    long epochTime = java.lang.System.currentTimeMillis();
    stmt.setObject(5, new java.sql.Date(epochTime));
    
    stmt.executeUpdate();
        
    ResultSet resultSet = stmt.getGeneratedKeys();
    resultSet.next();
    int lastInsertedPersonID = resultSet.getInt(1);
    
    0 讨论(0)
  • 2020-12-19 03:47

    Calling executeUpdate() expects no result from statement. Call stmt.execute() and then stmt.getResultSet()

    0 讨论(0)
提交回复
热议问题