java - 可以手动将 JSON 或 JSONB postgresql 数据类型与 spring r2dbc 一起使用吗?

标签 java postgresql java-11 r2dbc spring-data-r2dbc

我正在使用 spring boot、webflux 和 r2dbc (postgresql) 构建一个新的 api。我的一张表将有一个 json 或 jsonb 字段,用于存储动态 json 文档。

目前,r2dbc 不支持 postgresql 数据库的 json 数据类型。我想知道是否可以使用它,为存储库编写一些代码。

我已经创建了一个简单的测试项目来尝试这个,但还没有成功。我能够通过使用 org.springframework.data.r2dbc.core.DatabaseClient.execute() 并用 to_json() 包装 json 字段来保存 JSON 字段查询,但我无法稍后再读回它。

测试实体:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Table("Test")
public class Test {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", columnDefinition = "serial")
    private Long id;
    @Column(name = "data", columnDefinition = "json")
    private String data;

}

保存方法工作:

public Mono<Integer> save(Test test) {
        return databaseClient.execute("INSERT INTO test (data) VALUES(to_json($1))")
                .bind("$1", test.getData())
                .fetch()
                .rowsUpdated();
    }

回读异常:

java.lang.IllegalArgumentException: Cannot decode value of type java.lang.Object
    at io.r2dbc.postgresql.codec.DefaultCodecs.decode(DefaultCodecs.java:97)
    at io.r2dbc.postgresql.PostgresqlRow.get(PostgresqlRow.java:88)
    at io.r2dbc.spi.Row.get(Row.java:63)
    at org.springframework.data.r2dbc.convert.ColumnMapRowMapper.getColumnValue(ColumnMapRowMapper.java:100)
    at org.springframework.data.r2dbc.convert.ColumnMapRowMapper.apply(ColumnMapRowMapper.java:59)
    at org.springframework.data.r2dbc.convert.ColumnMapRowMapper.apply(ColumnMapRowMapper.java:44)
    at io.r2dbc.postgresql.PostgresqlResult.lambda$map$0(PostgresqlResult.java:71)

最佳答案

使用io.r2dbc.postgresql.codec.Json作为你的实体属性类型,勾选my post关于这个。

关于java - 可以手动将 JSON 或 JSONB postgresql 数据类型与 spring r2dbc 一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57225671/

相关文章:

java - Struts 2 中的范围模型驱动拦截器未将模型绑定(bind)到 session 范围

Java - 错误 : A JNI error has occurred, ... 在线程 "main"java.lang.UnsupportedClassVersionError 中:

sql - 如何从多个表中删除数据?

java - 同步 textArea.clear() 后跟 textArea.setText() 不会清除文本

soap - 迁移到 Jakarta : ClassNotFoundException: com. sun.xml.internal.ws.spi.ProviderImpl

java - setRequestProperty(用户代理)在 "a while"之后才激活

java - CheckBox isSelected() 方法总是返回 false

java - 如何在扩展 View 的类中设置 ContentView? (安卓、 java )

sql - Postgresql 中连续相同符号行的总和

postgresql - 来自连接表的 select 语句中的子查询