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>