【发布时间】:2018-03-28 05:53:08
【问题描述】:
我有一个带有 jsonb 列的 PostgreSQL 表,其中包含一个字符串数组,这些字符串是标记值,例如:["tag1", "tag2", "tag3"]。我有一个自定义绑定,可以将 JSON 与 jackson JsonNode 相互转换。
自定义绑定在这里定义: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。
【问题讨论】:
-
我很抱歉造成混乱。我要问的是您如何将
List<String>设置为该字段。我的意思是你将List<String>传递给set()方法,但是你是如何指定TAG_FIELD_NAME的DataType的?是DataType<List<String>>吗?你是如何配置绑定的?您链接的绑定是Binding<Object, JsonNode>,但从您发布的代码中,应该有一个Binding<Object, List<String>>... -
@LukasEder 我看到了混淆的来源,因为我在不同的上下文中重用了相同的变量名(一次用于列表,另一次用于 JsonNode)而没有正确描述它。当我调用 writeTags 方法时,我传递的是一个 JsonNode 对象,而不是一个列表。上面我已经在调试器中包含了 JsonNode 值的屏幕截图。抱歉,不清楚,感谢您的帮助和耐心。
标签: java json postgresql jooq