【发布时间】: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