Các phiên bản jOOQ hiện tại
jOOQ có hỗ trợ riêng cho JSON
và JSONB
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>
và <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>