वर्तमान 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>