【问题标题】:How to convert from JSONB in JOOQ 3.11如何在 JOOQ 3.11 中从 JSONB 转换
【发布时间】:2019-06-30 18:38:38
【问题描述】:

我正在尝试从 JSONB 转换为 Google GSON JsonElement。我使用的转换器来自:https://www.jooq.org/doc/3.11/manual/code-generation/custom-data-type-bindings/

Codegen 编译正常。但是当我运行查询时,我在 Jooq 中的 DefaultRecordMapper.map 函数中遇到错误。当我进入这个函数时,我可以看到查询已经正确返回,并且我的 JSONB 列是一个 PGobject。

我已经仔细检查了查询,它在 PSQL 中正常工作。我尝试将自定义转换器中的类型从 Object 更改为 PGobject,但这导致 codegen 失败。

再次,我使用的是:https://www.jooq.org/doc/3.11/manual/code-generation/custom-data-type-bindings/

我的 pom.xml 强制类型:

< forcedTypes >
    < forcedType >
        < userType>com.google.gson.JsonElement< /userType >
        < binding  >connection.JsonType< /binding >
        < types >.*json.*< /types >
    < /forcedType >
< /forcedTypes >

查询调用站点:

List<JooqPojo> data = DBConnection.sqlFetch(sql).into(JooqPojo.class)

DBConnection.sqlFetch 只返回一个结果(如前所述,这里没有抛出错误,我已经检查了抛出的结果,这很好):

public static Result<Record> sqlFetch(String query) {
    Result<Record> val = createDSL(conn).fetch(query);
    return val;
}

堆栈跟踪有:

Exception in thread "pool-18-thread-5" org.jooq.exception.MappingException: An error ocurred when mapping record to class public.tables.pojos.RawMSObj
at org.jooq.impl.DefaultRecordMapper$MutablePOJOMapper.map(DefaultRecordMapper.java:828)
at org.jooq.impl.DefaultRecordMapper.map(DefaultRecordMapper.java:481)
at org.jooq.impl.ResultImpl.into(ResultImpl.java:1372)
at tables.RawMSTable.getMatches(RawMSTable.java:61)
at task.MSTask$update$runnable$1.run(MSTask.kt:38)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.jooq.exception.DataTypeException: Cannot convert from {"json": data} (class org.postgresql.util.PGobject) to class com.google.gson.JsonElement
at org.jooq.tools.Convert$ConvertAll.fail(Convert.java:1166)
at org.jooq.tools.Convert$ConvertAll.from(Convert.java:1055)
at org.jooq.tools.Convert.convert0(Convert.java:321)
at org.jooq.tools.Convert.convert(Convert.java:313)
at org.jooq.tools.Convert.convert(Convert.java:385)
at org.jooq.impl.AbstractRecord.get(AbstractRecord.java:245)
at org.jooq.impl.DefaultRecordMapper$MutablePOJOMapper.map(DefaultRecordMapper.java:790)
... 7 more

TableImpl 中的列:

 public final TableField<RawfixturesRecord, JsonElement> FIXTURE = createField("fixture", org.jooq.impl.DefaultDataType.getDefaultDataType("\"pg_catalog\".\"jsonb\""), this, "", new JsonType());

【问题讨论】:

  • 能否请您发布更多相关的堆栈跟踪部分以及DBConnection.sqlFetch(...)的实现@
  • 谢谢。添加了这两个东西。

标签: java sql postgresql jooq


【解决方案1】:

您正在使用plain SQL API,在这种情况下,jOOQ 只需获取您的 SQL 输入字符串并运行它。它在运行语句时无法应用任何转换器或绑定,因此您的 JSONB 映射信息不适用。这会导致结果集中出现String 值(我怀疑),无法自动映射到JsonElement

您必须改为使用 jOOQ DSL 运行查询。

【讨论】:

    猜你喜欢
    • 2021-03-07
    • 2020-07-30
    • 1970-01-01
    • 2020-09-25
    • 2016-04-11
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    相关资源
    最近更新 更多