当前位置: 首页 > 知识库问答 >
问题:

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

洪飞白
2023-03-14

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

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

我已经创建了一个简单的测试项目来尝试这个,但还没有成功。我可以使用org保存JSON字段。springframework。数据r2dbc。果心DatabaseClient。execute()并在查询中用将json字段包装为\u 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)

共有2个答案

叶茂
2023-03-14

我能够通过查询将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();
}
钱峻
2023-03-14

使用io。r2dbc。postgresql。编解码器。Json作为您的实体属性类型,请查看我的帖子。

 类似资料:
  • 问题内容: 默认情况下,Hibernate 5不支持PostgreSQL 数据类型。 有什么方法可以实现对Hibernate + Spring JPA的支持? 如果有办法,与Hibernate一起使用的利弊是什么? 问题答案: 感谢Vlad Mihalcea我们有这样的机会!) 他创建了hibernate类型的 lib: 这为Hibernate添加了对’json’,’jsonb’和其他类型的支持:

  • 问题内容: 例如,它是否是有效的ajax请求: 有时仅作为示例,否则软件可能会在没有显式字符集的情况下崩溃。 用于application / json媒体类型的rfc 4627 表示,它不接受第6节中的任何参数: 可以解释为charset不应该与application /json一起使用。 和第3节表明,这是没有必要指定字符集: 因为可以从内容推断出UTF-8、16、32编码。为什么说UTF-8是

  • 问题内容: 是否可以使用Node.js在服务器端使用jQuery选择器/ DOM操作? 问题答案: 似乎有一个重大更新,导致原来的答案不再起作用。我找到了这个答案,解释了现在如何使用。我已经在下面复制了相关代码。 注意:原始答案没有提及你还需要使用安装

  • 我需要一些目前在JavaFX中找不到的功能。比如机器人或托盘图标。 我知道这些工具确实适用于JavaFx应用程序。但是可以使用它们吗?有什么需要我考虑的吗?

  • 我正在尝试在谷歌云中构建python ETL管道,谷歌云数据流似乎是一个不错的选择。当我浏览文档和开发人员指南时,我看到apache beam始终连接到数据流,因为它是基于它的。我可能会在apache beam中发现处理数据帧的问题。 我的问题是: 如果我想用带有数据流的本机python构建ETL脚本,这可能吗?或者我的ETL需要使用apache beam 我的管道旨在从BigQuery读取数据,

  • 例如,它是否是有效的ajax请求: 它有时被用作示例,或者软件可以在没有显式字符集的情况下中断。 rfc 4627 for application/json媒体类型表示不接受第6节中的任何参数: 可以这样解释,charset不应该与Application/json一起使用。 第3节建议无需指定字符集: 因为UTF-8,16,32编码可以从内容中感染。为什么说UTF-8是默认的?rfc中没有指定选择