当前位置: 首页 > 面试题库 >

是否可以编写数据类型Converter来处理Postgres JSON列?

邵兴庆
2023-03-14
问题内容

理想情况是在Java方面使用Jackson。我尝试了明显的解决方案:

public class JsonObjectConverter implements Converter<Object, ObjectNode> {

    private final ObjectMapper mapper = new ObjectMapper();

    @Override public ObjectNode from(Object dbo) {
        try {
            return dbo != null ? mapper.readValue((String) dbo, ObjectNode.class) : null;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override public Object to(ObjectNode uo) {
        try {
            return uo != null ? mapper.writeValueAsString(uo) : null;
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }

    @Override public Class<Object> fromType() {
        return Object.class;
    }

    @Override public Class<ObjectNode> toType() {
        return ObjectNode.class;
    }
}

但是,如果我尝试使用它,则会出现类似以下的错误:

org.jooq.exception.DataAccessException: SQL [insert into "public"."my_table" ("id", "stuff") values (?, ?)]; ERROR: column "stuff" is of type json but expression is of type character varying
  Hint: You will need to rewrite or cast the expression.

但是,由于jOOQ强制执行类型安全(这很不错,顺便说一句),我不能只添加a.cast(String.class)并完成操作。那么,我是否需要在转换器中做其他事情,还是应该以其他方式调用代码?我目前正在这样做:

Long id = ...
ObjectNode stuff = ...
create.insertInto(MY_TABLE)
    .set(MY_TABLE.ID, id)
    .set(MY_TABLE.STUFF, stuff)
    .execute();

并在代码的其他地方使用可更新的记录。


问题答案:

是的,是的,但是您需要使用Postgres特定的API。在上面的代码中,您需要将from / to方法替换为以下内容:

@Override
public ObjectNode from(Object databaseObject) {
    if (databaseObject == null) { return null; }
    try {
        PGobject dbo = (PGobject) databaseObject;
        return mapper.readValue(dbo.getValue(), ObjectNode.class);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

@Override
public Object to(ObjectNode userObject) {
    if (userObject == null) { return null; }
    try {
        PGobject dbo = new PGobject();
        dbo.setType("json");
        dbo.setValue(mapper.writeValueAsString(userObject));
        return dbo;
    } catch (JsonProcessingException|SQLException e) {
        throw new RuntimeException(e);
    }
}


 类似资料:
  • 问题内容: 我有多个共享某些字段。例如, 我还有一个仅处理共享字段的功能,例如 如何处理这种情况?我知道我们可以将颜色和质量转换为函数,然后可以使用interface并将该接口传递给function 。但是,如果不能更改和的类型,该怎么办。我是否必须定义两个具有基本相同实现的功能? 问题答案: 在Go中,您不会像Java,c#等那样使用传统的多态性。大多数事情都是使用合成和类型嵌入完成的。一种简单

  • 问题是,如果我执行上述^,以访问endpoint上的请求信息,则如果筛选器验证失败,我就不能再中止筛选器中的请求,因为我会得到以下错误: 似乎如果您在Jerseyendpoint上定义任何类型的参数,这些参数可以在ContainerRequestContext中访问,那么它将不允许您中止过滤器中的过滤器链。 一个解决方法(我还没有尝试过,但假设会成功)是这样做:如果过滤器验证失败,我可以只向请求添

  • 本文向大家介绍将数据写入块后是否可以更改数据?相关面试题,主要包含被问及将数据写入块后是否可以更改数据?时的应答技巧和注意事项,需要的朋友参考一下 回答:不,这是不可能的。如果需要进行任何修改,组织也必须从所有其他模块中删除信息。

  • 问题内容: 我想知道是否可以在Swift中编写内联汇编。 我知道在Objective-C中,您可以使用如下代码: 但是在Swift中似乎无法使用 。 有谁知道如何使用,如果可能的话。我没有找到任何关于它的信息,所以我认为这是一个很好的问题。 问题答案: 要扩展Robert Levy所说的内容,您可以只使用Swift / Obj-C互操作功能,并编写一个可以处理ASM内容的Obj- C类,然后可以从

  • 所以我被要求写一个程序,列出学生的名字和分数,并计算平均分数。您需要声明两个名为name和marks的数组。假设学生人数为5人。 声明数组名称:(使用二维数组)字符名称[num\u std][name\u len]//名称长度可以为20个字符 声明数组标记:浮点标记[num\u std]; 让我恼火的是,我不知道为什么当我尝试运行调用名称和标记的循环时我会得到一个空。我还想知道以这种方式编码我的二

  • 问题内容: 问题是:编写一个交换两个变量的方法。这两个变量应该是原语。它不需要是通用的,例如两个变量。有办法吗? 问题答案: 如果不使用数组或对象,不可以,无法在方法中进行操作。