java - jOOQ - 如何使用 Postgres 表中的数组更新 jsonb 列以避免 SQLDialectNotSupportedException

标签 java json postgresql jooq

我有一个带有 jsonb 列的 PostgreSQL 表,其中包含作为标记值的字符串数组,如下所示:["tag1", "tag2", "tag3"] .我有一个自定义绑定(bind),可以将 JSON 与 jackson JsonNode 相互转换。

自定义绑定(bind)在这里定义:https://gist.github.com/HelgeG/0c0b14228f75e91b7542bd6979a05b49

使用基本查找读取记录,然后按如下方式提取 JSON 列:

VRelease release = releaseModel.find(id);
JsonNode tagNode = release.getTags();

节点转换为List<String>

  List<String> tagList = objectMapper.readValue(
      tagNode.toString(),
      objectMapper.getTypeFactory().constructCollectionType(
          List.class, String.class));

然后我向列表中添加一个字符串并将列表转换回 JSON 格式的字符串

  tagList.add(tag);
  String jsonString = objectMapper.writeValueAsString(tagList);

然后我将 JSON 格式的字符串转换为 JsonNode,并尝试将其写回数据库:

  releaseModel.writeTags(id, objectMapper.readValue(jsonString, JsonNode.class));

writeTags方法仅执行以下操作:

  public int writeTags(Integer id, JsonNode tagList) {
    return ctx.update(TABLE).set(field(TAG_FIELD_NAME), tagList).where(PRIMARY_KEY.eq(id))
        .execute();
  }

但是,在执行此查询时,出现以下异常:

org.jooq.exception.SQLDialectNotSupportedException: Type class com.fasterxml.jackson.databind.node.ArrayNode is not supported in dialect POSTGRES

在调试器中检查 JsonNode 对象,它的值为:

JsonNode in debugger

我已经为此苦苦挣扎了很长一段时间,如果 jOOQers 比我更有经验,我将不胜感激任何关于如何成功地将 JSON 数组写入数据库的指示。

这是 jOOQ v3.9.5 和 PostgreSQL 9.6.5。

最佳答案

我假设 TAG_FIELD_NAME只是一个简单的 String描述您的列名称。那样的话,解释就很简单了。 jOOQ 对您的自定义一无所知Binding对于 JsonNode类型,更不用说 List<ArrayNode> 了.

您的代码可以编译,因为您使用的是 DSL.field(String) 返回 Field<Object> .但是这样的字段只能用于 jOOQ 和 JDBC 驱动程序都知道如何处理的“普通”JDBC 类型。为了实际绑定(bind)绑定(bind)到您的字段的数据类型,您必须将其提供给jOOQ。改为这样写:

DataType<List<ArrayNode>> ARRAY_NODE_LIST = SQLDataType.OTHER.asConvertedDataType(
    new ArrayNodeListBinding());

然后按如下方式使用:

ctx.update(TABLE)
   .set(field(TAG_FIELD_NAME, ARRAY_NODE_LIST), tagList)
   // your new data type here ^^^^^^^^^^^^^^^
   .where(PRIMARY_KEY.eq(id))
   .execute();

现在您只需编写该绑定(bind)。您发布的绑定(bind)在这里不起作用,因为它绑定(bind)了 JsonNode , 不是 List<ArrayNode>

关于java - jOOQ - 如何使用 Postgres 表中的数组更新 jsonb 列以避免 SQLDialectNotSupportedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46774898/

相关文章:

java - JsonNode isTextual() 莫名其妙地返回 false

asp.net - 如何让 ASP.NET AJAX 使用 GZip 压缩发送其 JSON 响应?

sql - 返回数组的 unnest() 子查询?

java - describeLoadBalancers 不显示经典负载均衡器

java - Java中匿名类的方法

java - 为什么在使用@JoinTable 时会忽略@DiscriminatorColumn?

java - 从自定义 IStorage 实现获取 IProject

java - 将 MySQL JSON 列映射到 hibernate 值类型

postgresql - 从 Docker Compose 堆栈中的 ASP.NET Core 6 通过 Npgsql 连接到 PostgreSql

postgresql - 如何获取一张表中某列的行