PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да вмъкна обновяем запис с колона JSON в PostgreSQL с помощта на JOOQ?

Текущи версии на jOOQ

jOOQ има естествена поддръжка за JSON и JSONB типове данни, така че не е нужно да правите нищо конкретно.

Исторически отговор

От jOOQ 3.5 можете да регистрирате свои собствени персонализирани обвързвания с тип данни към генератора на код, както е документирано тук:

http://www.jooq.org/doc/latest/manual/code-generation/custom-data-type-bindings

За разлика от Converter , a Binding диктува как вашият тип данни се обработва на ниво JDBC в рамките на jOOQ, без jOOQ да знае за вашата реализация. Тоест, не само ще дефинирате как да конвертирате между <T> и <U> типове (T =тип база данни, U =тип потребител), но също така ще можете да дефинирате как са тези типове:

  • Предадено като SQL
  • Обвързан с PreparedStatements
  • Обвързан към SQLOutput
  • Регистриран в CallableStatements като OUT параметри
  • Извлечено от ResultSets
  • Извлечено от SQLInput
  • Извлечено от CallableStatements като OUT параметри

Пример за Binding за използване с Jackson за създаване на JsonNode типове е даден тук:

public class PostgresJSONJacksonJsonNodeBinding 
implements Binding<Object, JsonNode> {

    @Override
    public Converter<Object, JsonNode> converter() {
        return new PostgresJSONJacksonJsonNodeConverter();
    }

    @Override
    public void sql(BindingSQLContext<JsonNode> ctx) throws SQLException {

        // This ::json cast is explicitly needed by PostgreSQL:
        ctx.render().visit(DSL.val(ctx.convert(converter()).value())).sql("::json");
    }

    @Override
    public void register(BindingRegisterContext<JsonNode> ctx) throws SQLException {
        ctx.statement().registerOutParameter(ctx.index(), Types.VARCHAR);
    }

    @Override
    public void set(BindingSetStatementContext<JsonNode> ctx) throws SQLException {
        ctx.statement().setString(
            ctx.index(), 
            Objects.toString(ctx.convert(converter()).value()));
    }

    @Override
    public void get(BindingGetResultSetContext<JsonNode> ctx) throws SQLException {
        ctx.convert(converter()).value(ctx.resultSet().getString(ctx.index()));
    }

    @Override
    public void get(BindingGetStatementContext<JsonNode> ctx) throws SQLException {
        ctx.convert(converter()).value(ctx.statement().getString(ctx.index()));
    }

    // The below methods aren't needed in PostgreSQL:

    @Override
    public void set(BindingSetSQLOutputContext<JsonNode> ctx) throws SQLException {
        throw new SQLFeatureNotSupportedException();
    }

    @Override
    public void get(BindingGetSQLInputContext<JsonNode> ctx) throws SQLException {
        throw new SQLFeatureNotSupportedException();
    }
}

И Converter който се използва по-горе може да се види тук:

public class PostgresJSONJacksonJsonNodeConverter 
implements Converter<Object, JsonNode> {
    @Override
    public JsonNode from(Object t) {
        try {
            return t == null 
              ? NullNode.instance 
              : new ObjectMapper().readTree(t + "");
        }
        catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public Object to(JsonNode u) {
        try {
            return u == null || u.equals(NullNode.instance) 
              ? null 
              : new ObjectMapper().writeValueAsString(u);
        }
        catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public Class<Object> fromType() {
        return Object.class;
    }

    @Override
    public Class<JsonNode> toType() {
        return JsonNode.class;
    }
}

Вече можете да регистрирате горното обвързване чрез конфигурацията на генератора на код:

<customType>
    <name>com.example.PostgresJSONJacksonJsonNodeBinding</name>
    <type>com.fasterxml.jackson.databind.JsonNode</type>
    <binding>com.example.PostgresJSONJacksonJsonNodeBinding</binding>
</customType>

<forcedType>
    <name>com.example.PostgresJSONJacksonJsonNodeBinding</name>
    <expression>my_schema\.table\.json_field</expression>
</forcedType>



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Производителност на OLTP след PostgreSQL 8.3

  2. Право запитване, за да получите текущия брой връзки в PostgreSQL DB

  3. Как да приложим функция към всеки елемент от колона на масив в Postgres?

  4. Rails и PostgreSQL:Ролята postgres не съществува

  5. Какво е новото в PostgreSQL 12