我正在尝试从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:
< 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 moreTableImpl中的列:
public final TableField<RawfixturesRecord, JsonElement> FIXTURE = createField("fixture", org.jooq.impl.DefaultDataType.getDefaultDataType("\"pg_catalog\".\"jsonb\""), this, "", new JsonType());发布于 2019-02-08 16:01:29
您使用的是plain SQL API,在这种情况下,jOOQ只接受您的SQL输入字符串并运行它。在运行该语句时,它不能应用任何转换器或绑定,因此您的JSONB映射信息不适用。这会导致结果集中的String值(我怀疑),它不能自动映射到JsonElement。
您必须使用jOOQ DSL运行查询。
https://stackoverflow.com/questions/54559904
复制相似问题