PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak wstawić aktualizowalny rekord z kolumną JSON w PostgreSQL za pomocą JOOQ?

Aktualne wersje jOOQ

jOOQ ma natywną obsługę JSON i JSONB typy danych, więc nie musisz robić nic konkretnego.

Historyczna odpowiedź

Od jOOQ 3.5, możesz zarejestrować własne niestandardowe powiązania typów danych z generatorem kodu, zgodnie z dokumentacją tutaj:

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

W przeciwieństwie do Converter , Binding dyktuje sposób obsługi typu danych na poziomie JDBC w jOOQ, bez wiedzy jOOQ o implementacji. Oznacza to, że nie tylko określisz sposób konwersji między <T> i <U> typy (T =typ bazy danych, U =typ użytkownika), ale będziesz mógł również określić, jakie są takie typy:

  • Renderowane jako SQL
  • Związany z przygotowanymi zeznaniami
  • Związany z SQLOutput
  • Zarejestrowany w CallableStatements jako parametry OUT
  • Pobrano z zestawów wyników
  • Pobrano z SQLInput
  • Pobrane z CallableStatements jako parametry OUT

Przykładowe Binding do użytku z Jacksonem do tworzenia JsonNode typy podano tutaj:

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

Oraz Converter który jest używany powyżej można zobaczyć tutaj:

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;
    }
}

Możesz teraz zarejestrować powyższe powiązanie za pomocą konfiguracji generatora kodu:

<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. 3 sposoby na wyświetlenie listy wszystkich procedur składowanych, które odwołują się do tabeli w PostgreSQL

  2. Wskazówki dotyczące wdrażania PostgreSQL w chmurze hybrydowej

  3. Jak to_char() działa w PostgreSQL

  4. GeneratedValue w Postgres

  5. Funkcja zwracająca dynamiczny zestaw kolumn dla danej tabeli