Как вернуть из запроса на добавление сгенерированный id в PostgresSQL?

324
12 мая 2017, 14:57

У меня есть такой запрос:

insert into tasks (task_id, author, header, description, create_time)
values (default, (?), (?), (?), now()::timestamp)

Который я отправляю через JDBC Driver вот так:

public void addItem(final Item item) throws SQLException {
    // Так я генерирую запрос приведенный выше.
    final String requestPattern = this.requests.generate("add_item");
    if (item == null) throw new IllegalArgumentException();

    try (final PreparedStatement statement =
                 this.connection.get()
                         .prepareStatement(requestPattern)) {

        // First position = author.
        statement.setString(1, item.getNameUser());
        // Second position = header.
        statement.setString(2, item.getHeader());
        // Treed position = description.
        statement.setString(3, item.getDescription());

        statement.executeUpdate();
    }
}

И как говориться, все бы было ничего еслиб знала от кого. Когда я выполняю этот запрос я не знаю какой id присвоит postgres моему кортежу. Я знаю что можно как-то получить это значение прямо в рамках запроса на добавление. Но как? и как мне через JDBC драйвер его принять из моего statement?

Помогите пожалуйста.

Answer 1

После выполнения запроса, надо запросить сгенерированные ключи:

statement.executeUpdate();
ResultSet rs = statement.getGeneratedKeys();
if (rs.next()) {
    id = rs.getLong(1); //вставленный ключ
}

Update

Как верно заметил @Regent запрос надо выполнять с флагом Statement.RETURN_GENERATED_KEYS

 statement.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);

или

PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
READ ALSO
Лагает при скролле RecyclerView

Лагает при скролле RecyclerView

Вообщем проблема такая, есть TabLayout и ViewPager, всего вкладок у меня 5, на первых двух вкладках идет RecyclerView с данными, а на 3 избранные, по началу...

350
GMP4J на андроиде с помощью ndk

GMP4J на андроиде с помощью ndk

Нашел проект который создает подобие javamath

199