PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara memasukkan catatan yang dapat diperbarui dengan kolom JSON di PostgreSQL menggunakan JOOQ?

Versi jOOQ saat ini

jOOQ memiliki dukungan asli untuk JSON dan JSONB tipe data, jadi Anda tidak perlu melakukan sesuatu yang spesifik.

Jawaban bersejarah

Sejak jOOQ 3.5, Anda dapat mendaftarkan binding tipe data kustom Anda sendiri ke pembuat kode seperti yang didokumentasikan di sini:

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

Tidak seperti Converter , sebuah Binding menentukan bagaimana tipe data Anda ditangani di tingkat JDBC dalam jOOQ, tanpa jOOQ mengetahui tentang implementasi Anda. Yaitu, Anda tidak hanya akan menentukan cara mengonversi antara <T> dan <U> jenis (T =tipe basis data, U =tipe pengguna), tetapi Anda juga dapat menentukan bagaimana tipe tersebut:

  • Dirender sebagai SQL
  • Terikat pada Pernyataan yang Disiapkan
  • Terikat ke SQLOutput
  • Terdaftar di CallableStatements sebagai parameter KELUAR
  • Diambil dari ResultSets
  • Diambil dari SQLInput
  • Diambil dari CallableStatements sebagai parameter KELUAR

Contoh Binding untuk digunakan dengan Jackson untuk menghasilkan JsonNode jenis diberikan di sini:

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

Dan Converter yang digunakan diatas bisa dilihat disini :

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

Anda sekarang dapat mendaftarkan pengikatan di atas melalui konfigurasi pembuat kode:

<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. Bermigrasi Dari Oracle ke PostgreSQL - Yang Harus Anda Ketahui

  2. DROP TABLE Postgresql tidak berfungsi

  3. Hapus baris duplikat dari tabel kecil

  4. Tidak dapat menghubungkan PostgreSQL ke basis data jarak jauh menggunakan pgAdmin

  5. Bagaimana Ceiling() Bekerja di PostgreSQL