为了账号安全,请及时绑定邮箱和手机立即绑定

在 JOOQ 自定义绑定中生成 SQL 以填充 MySQL JSON 函数时访问字段名称或别名

在 JOOQ 自定义绑定中生成 SQL 以填充 MySQL JSON 函数时访问字段名称或别名

阿晨1998 2021-06-22 03:06:14
将 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);                }            }
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 279 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信