将 JOOQ 3.5.2 与 MySQL 5.7 一起使用,我正在尝试完成以下任务...
MySQL 有一组 JSON 函数,允许对较大文档中的属性进行路径定向操作。
我正在尝试使用 JOOQ 进行抽象,以利用这一点。我首先创建了 JSON 可序列化的文档模型,它跟踪更改,然后Binding为其实现了 JOOQ 自定义。
在此绑定中,我拥有生成对这些 MySQL JSON 函数的调用所需的所有状态信息,但要更新的列的限定名称或别名除外。就地更新现有 JSON 文档需要对此名称的引用。
我一直无法找到从ContextBinding 接口中可用的 *类型访问此名称的方法。
我一直在考虑实现一个VisitListener来捕获这些字段名称并通过Scope自定义数据映射传递它们,但该选项似乎非常脆弱。
在我的 Binding 实现中访问字段名称或别名的最佳方法是什么?
- 编辑 -
好的,为了帮助澄清我的目标,请使用以下 DDL:
create table widget (
widget_id bigint(20) NOT NULL,
jm_data json DEFAULT NULL,
primary key (widget_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
现在让我们假设 jm_data 将保存 a 的 JSON 表示java.util.Map<String,String>。为此,JOOQ 通过实现和注册自定义数据类型绑定(在本例中使用 Jackson)提供了一个非常好的扩展 API:
public class MySQLJSONJacksonMapBinding implements Binding<Object, Map<String, String>> {
private static final ObjectMapper mapper = new ObjectMapper();
// The converter does all the work
@Override
public Converter<Object, Map<String, String>> converter() {
return new Converter<Object, Map<String, String>>() {
@Override
public Map<String, String> from(final Object t) {
try {
return t == null ? null
: mapper.readValue(t.toString(),
new TypeReference<Map<String, String>>() {
});
} catch (final IOException e) {
throw new RuntimeException(e);
}
}
@Override
public Object to(final Map<String, String> u) {
try {
return u == null ? null
: mapper.writer().writeValueAsString(u);
} catch (final JsonProcessingException e) {
throw new RuntimeException(e);
}
}
相关分类