java - 如何从 JOOQ 3.11 中的 JSONB 转换

标签 java sql postgresql jooq

我正在尝试将 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/ 的精确副本

我的 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 more

TableImpl 中的列:

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

最佳答案

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

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

关于java - 如何从 JOOQ 3.11 中的 JSONB 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54559904/

相关文章:

Java:我丢失了 session :使用 "<a href >"会出现问题吗?

java - 使用 Spring Data JPA 正确调用存储过程

mysql - 这个SQL语句中的ogi和gi是什么意思

sql - 在 Access 中连接一个字段中的多行?

mysql - 删除涉及 2 名以上员工的项目

postgresql - 在 PostgreSQL 中导入/更新现有行

postgresql - 外键引用唯一的复合键或单个主键

java - 安卓工作室 : @Override "Annotations are not allowed here"

java - 如何在安装时在 Android 手机的主屏幕上创建应用程序快捷方式

postgresql - 在 Windows 上使用 osm2pgsql 将 .osm.bz2 转换并导入到 postGis 失败