如何将 JsonNode 参数(micronaut + kotlin)保存为 postgres 数据库中的 jsonb

Lor*_*ena 2 postgresql kotlin jsonb jsonnode micronaut-data

我正在尝试保存一个具有 JsonNode 属性的实体,并且必须将其转换为 jsonb 才能存储在 postgres 数据库中。

这是数据库表:

CREATE TABLE IF NOT EXISTS configuration_data (
   id SERIAL NOT NULL PRIMARY KEY,
   namespace_name TEXT NOT NULL,
   dimension_id TEXT NOT NULL,
   dimension_value TEXT,
   path TEXT,
   data JSONB,
   version BIGINT DEFAULT 0
);
Run Code Online (Sandbox Code Playgroud)

这是实体:

@MappedEntity(value = "configuration_data")
data class ConfigurationDataEntity(
    @field:Id @GeneratedValue
    val id: Long,
    @MappedProperty("namespace_name")
    val namespaceName: String,
    @MappedProperty("dimension_id")
    val dimensionId: String,
    @MappedProperty("dimension_value")
    val dimensionValue: String,
    @MappedProperty("path")
    val path: String,
    @MappedProperty("data")
    val data: JsonNode,
    @MappedProperty("version")
    val version: Long,
)
Run Code Online (Sandbox Code Playgroud)

我正在尝试将这样的实体保存到存储库中:

val entity = ConfigurationDataEntity(1L, coordinates.namespace, "acc", "abc", "path", data, 1L)

repository.save(entity)

Run Code Online (Sandbox Code Playgroud)

我收到的错误如下:

Caused by: io.micronaut.data.exceptions.DataAccessException: Error executing PERSIST: Unable to set PreparedStatement value: Can't infer the SQL type to use for an instance of com.fasterxml.jackson.databind.node.ObjectNode. Use setObject() with an explicit Types value to specify the type to use.
Run Code Online (Sandbox Code Playgroud)

我想这是因为 postgres 无法将 jsonNode 存储在 jsonb 对象中,但我不知道如何将 JsonNode 转换为 jsonb。

预先非常感谢您:)

Lor*_*ena 5

将此注释添加到字段中:

@field:TypeDef(type = DataType.JSON)
Run Code Online (Sandbox Code Playgroud)

所以实体仍然是这样的:

@MappedEntity(value = "configuration_data")
data class ConfigurationDataEntity(
    @field:Id @GeneratedValue
    val id: Long,
    @MappedProperty("namespace_name")
    val namespaceName: String,
    @MappedProperty("dimension_id")
    val dimensionId: String,
    @MappedProperty("dimension_value")
    val dimensionValue: String,
    @MappedProperty("path")
    val path: String,
    @MappedProperty("data")
    **@field:TypeDef(type = DataType.JSON)**
    val data: JsonNode,
    @MappedProperty("version")
    val version: Long,
)
Run Code Online (Sandbox Code Playgroud)