我有一个带有 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 对象,它的值为:
我已经为此苦苦挣扎了很长一段时间,如果 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/