首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在JOOQ 3.11中转换JSONB

如何在JOOQ 3.11中转换JSONB
EN

Stack Overflow用户
提问于 2019-02-07 02:03:38
回答 1查看 2.1K关注 0票数 1

我正在尝试从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,但这导致代码生成器失败。

同样,我使用的是一个完全相同的副本:https://www.jooq.org/doc/3.11/manual/code-generation/custom-data-type-bindings/

My pom.xml forcedTypes:

代码语言:javascript
复制
< forcedTypes >
    < forcedType >
        < userType>com.google.gson.JsonElement< /userType >
        < binding  >connection.JsonType< /binding >
        < types >.*json.*< /types >
    < /forcedType >
< /forcedTypes >

查询调用点:

代码语言:javascript
复制
List<JooqPojo> data = DBConnection.sqlFetch(sql).into(JooqPojo.class)

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

代码语言:javascript
复制
public static Result<Record> sqlFetch(String query) {
    Result<Record> val = createDSL(conn).fetch(query);
    return val;
}

堆栈跟踪具有:

代码语言:javascript
复制
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中的列:

代码语言:javascript
复制
 public final TableField<RawfixturesRecord, JsonElement> FIXTURE = createField("fixture", org.jooq.impl.DefaultDataType.getDefaultDataType("\"pg_catalog\".\"jsonb\""), this, "", new JsonType());
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-08 16:01:29

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54559904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档