Apache DdlUtils:: как получить имя последовательности для ключей автоинкремента?

Я использую Apache DdlUtils для запроса к базе данных PostgreSQL метаданных таблиц и столбцов (конечной целью является автоматическое генерирование аннотированных bean-компонентов сущности javax.persistence). Однако мне кажется, что библиотека DdlUtils не предоставляет способ получения имен последовательностей, используемых в столбцах с автоинкрементом. Класс Column предоставляет метод isAutoIncrement для запроса статуса автоинкремента, но я не смог найти способ получить имя последовательности, связанное с ним. Это часть DDL в PostgreSQL, например:

orders=# \dS customer
                         Table "public.customer"
    Column     |       Type        |                    Modifiers
---------------+-------------------+--------------------------------------------------
 id            | integer           | not null default nextval('cst_id_seq'::regclass)
 name          | character varying | not null
 (...)

Должен ли я напрямую запросить некоторую таблицу метаданных / каталога, чтобы получить этот бит информации?

1 ответ

Решение

Отвечая на мой собственный вопрос... Да, точно так же, как предложил Millimoose, это не может быть сделано с помощью DdlUtils, и вам нужно запросить таблицу information_schema.columns:

public String getPostgreSQLSequenceForColumn(String database, String table, String column) {
    try {
        Statement stmt = connection.createStatement();
        String sql="select column_default from information_schema.columns where "+
                   "table_catalog='"+database+"' and "                           +
                   "table_schema='public' and "                                  +
                   "table_name='"+table+"' and "                                 +
                   "column_name='"+column+"'";
        ResultSet rs = stmt.executeQuery(sql);
        rs.next();
        String sequenceName = rs.getString(1);
        panicIf(rs.next());
        return sequenceName;
    } catch (Exception e) {
        throw new ExceptionAdapter(e);
    }
}
Другие вопросы по тегам