如何在JOOQ 3.11中从JSONB转换

时间:2019-02-06 18:03:38

标签: java sql postgresql jooq

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

中的Converter

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

我已经仔细检查了查询,它在PSQL中可以正常工作。我尝试将自定义Converter中的类型从Object更改为PGobject,但这导致代码生成失败。

再次,我使用的是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());

1 个答案:

答案 0 :(得分:1)

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

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