PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

JOOQ का उपयोग करके PostgreSQL में JSON कॉलम के साथ एक अद्यतन करने योग्य रिकॉर्ड कैसे सम्मिलित करें?

वर्तमान jOOQ संस्करण

jOOQ के पास JSON . के लिए मूल समर्थन है और JSONB डेटा प्रकार, इसलिए आपको कुछ विशिष्ट करने की आवश्यकता नहीं है।

ऐतिहासिक उत्तर

jOOQ 3.5 के बाद से, आप अपने स्वयं के कस्टम डेटा प्रकार बाइंडिंग को कोड जनरेटर में पंजीकृत कर सकते हैं जैसा कि यहां दस्तावेज है:

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

एक Converter के विपरीत , एक Binding यह निर्धारित करता है कि आपके डेटा प्रकार को jOOQ के भीतर JDBC स्तर पर कैसे नियंत्रित किया जा रहा है, बिना jOOQ को आपके कार्यान्वयन के बारे में जाने बिना। यानी, आप न केवल यह परिभाषित करेंगे कि <T> . के बीच कनवर्ट कैसे करें और <U> प्रकार (T =डेटाबेस प्रकार, U =उपयोगकर्ता प्रकार), लेकिन आप यह भी परिभाषित करने में सक्षम होंगे कि ऐसे प्रकार कैसे हैं:

  • एसक्यूएल के रूप में रेंडर किया गया
  • तैयार बयानों के लिए बाध्य
  • SQLOutput के लिए बाध्य
  • आउट पैरामीटर के रूप में CallableStatements में पंजीकृत
  • परिणामसेट से प्राप्त किया गया
  • SQLInput से प्राप्त किया गया
  • कॉल करने योग्य स्टेटमेंट से आउट पैरामीटर के रूप में प्राप्त किया गया

एक उदाहरण Binding जैक्सन के साथ उपयोग के लिए 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. पोस्टग्रेज में बाइटा डेटा प्रकार से सेटआईकॉन के माध्यम से जेएलएबल को अपडेट कर रहा है

  2. PostgreSQL ट्यूनिंग:प्रदर्शन बढ़ाने के लिए मुख्य बातें

  3. PostgreSQL में डिफ़ॉल्ट मान के रूप में UTC में वर्तमान समय का उपयोग करना

  4. लेखन त्रुटि:'int' ऑब्जेक्ट अनुक्रमण का समर्थन नहीं करता

  5. pyspark शेल में jdbc का उपयोग करके पोस्टग्रेज से कनेक्ट करने में सक्षम नहीं है