PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm cách nào để chèn một bản ghi có thể cập nhật với cột JSON trong PostgreSQL bằng JOOQ?

Các phiên bản jOOQ hiện tại

jOOQ có hỗ trợ riêng cho JSONJSONB kiểu dữ liệu, vì vậy bạn không phải làm bất cứ điều gì cụ thể.

Câu trả lời lịch sử

Kể từ jOOQ 3.5, bạn có thể đăng ký các ràng buộc kiểu dữ liệu tùy chỉnh của riêng mình với trình tạo mã như được ghi lại ở đây:

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

Không giống như một công cụ chuyển đổi Converter , một Binding cho biết kiểu dữ liệu của bạn đang được xử lý như thế nào ở cấp JDBC trong jOOQ mà không cần jOOQ biết về việc triển khai của bạn. Tức là bạn không chỉ xác định cách chuyển đổi giữa <T><U> các loại (T =loại cơ sở dữ liệu, U =kiểu người dùng), nhưng bạn cũng có thể xác định các kiểu như vậy như thế nào:

  • Được hiển thị dưới dạng SQL
  • Ràng buộc với Các trạng thái chuẩn bị trước
  • Liên kết với SQLOutput
  • Đã đăng ký trong các tham số CallableStatements dưới dạng OUT
  • Tìm nạp từ ResultSets
  • Tìm nạp từ SQLInput
  • Tìm nạp từ CallableStatements dưới dạng tham số OUT

Một ví dụ về Binding để sử dụng với Jackson để sản xuất JsonNode các loại được đưa ra ở đây:

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

Và công cụ chuyển đổi Converter được sử dụng ở trên có thể được xem tại đây:

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

Bây giờ bạn có thể đăng ký ràng buộc ở trên thông qua cấu hình trình tạo mã:

<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. Phát hiện các mục trùng lặp trong CTE đệ quy

  2. Lập bản đồ mảng với Hibernate

  3. CTE đệ quy nối các trường với cha mẹ từ điểm tùy ý

  4. Bản ghi dựa trên con trỏ trong PostgreSQL

  5. PostgreSQL không thể bắt đầu / kết thúc giao dịch trong PL / pgSQL