Search code examples
javaprepared-statement

Get RETURNING value from Postgresql via Java


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 how to get it from my prepared statement:

        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();

Solution

  • 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.execute();
    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.