code: public ResultSet executeWithKeys() {
          context = startContext(connection(), metadata, entity);
          try {
              if (configuration.getTemplates().isNativeMerge()) {
                  PreparedStatement stmt = null;
                  if (batches.isEmpty()) {
                      stmt = createStatement(true);
                      listeners.notifyMerge(entity, metadata, keys, columns, values, subQuery);
  
                      listeners.preExecute(context);
                      stmt.executeUpdate();
                      listeners.executed(context);
                  } else {
                      Collection<PreparedStatement> stmts = createStatements(true);
                      if (stmts != null && stmts.size() > 1) {
                          throw new IllegalStateException("executeWithKeys called with batch statement and multiple SQL strings");
                      }
                      stmt = stmts.iterator().next();
                      listeners.notifyMerges(entity, metadata, batches);
  
                      listeners.preExecute(context);
                      stmt.executeBatch();
                      listeners.executed(context);
                  }
  
                  final Statement stmt2 = stmt;
                  ResultSet rs = stmt.getGeneratedKeys();
                  return new ResultSetAdapter(rs) {
                      @Override
                      public void close() throws SQLException {
                          try {
                              super.close();
                          } finally {
                              stmt2.close();
                              reset();
                              endContext(context);
                          }
                      }
                  };
              } else {
                  if (hasRow()) {
                      // update
                      SQLUpdateClause update = new SQLUpdateClause(connection(), configuration, entity);
                      update.addListener(listeners);
                      populate(update);
                      addKeyConditions(update);
                      reset();
                      endContext(context);
                      return EmptyResultSet.DEFAULT;
                  } else {
                      // insert
                      SQLInsertClause insert = new SQLInsertClause(connection(), configuration, entity);
                      insert.addListener(listeners);
                      populate(insert);
                      return insert.executeWithKeys();
                  }
              }
          } catch (SQLException e) {
              onException(context,e);
              reset();
              endContext(context);
              throw configuration.translate(queryString, constants, e);
          }
      }
docs: Execute the clause and return the generated keys as a ResultSet
  
  @return result set with generated keys