将 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); } }
添加回答
举报
0/150
提交
取消