猿问

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

将 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);

                }

            }


阿晨1998
浏览 280回答 1
1回答
随时随地看视频慕课网APP

相关分类

Java
我要回答