2

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

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

我创建了一个简单的测试项目来尝试一下,但还没有运气。我能够通过在查询中使用org.springframework.data.r2dbc.core.DatabaseClient.execute()和包装 json 字段来保存 JSON 字段to_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)
4

2 回答 2

2

io.r2dbc.postgresql.codec.Json用作您的实体属性类型,请查看我的帖子

于 2020-10-08T03:48:17.440 回答
1

我可以通过查询将 json/jsonb 转换为 TEXT 来做到这一点。我不确定这是否是正确的选择,但它确实有效。

public Mono<Test> findById(Long id) {
    return databaseClient.execute("SELECT id, data::TEXT FROM test WHERE id = $1")
            .bind("$1", id)
            .map(row -> new Test(
                          row.get("id", Long.class),
                          row.get("data", String.class)
                        )
            )
            .one();
}
于 2019-08-01T17:51:50.967 回答