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

如何用spring数据jdbc读/写postgres jsonb类型?

端木弘方
2023-03-14

我正在尝试将以下内容与spring-data-jdbc和postgres驱动程序(kotlin)一起使用,

data class MyEntity(
  val id: UUID,
  val content: String
)

使用字符串失败,出现以下错误,

org.postgresql.util.PSQLException: ERROR: column "content" is of type jsonb but expression is of type character varying
  Hint: You will need to rewrite or cast the expression.
  Position: 31

我不知道如何使用字符串转换器-

共有1个答案

农飞尘
2023-03-14

在此帮助下,我实现了以下解决方案:

  1. 引入一个自己的类(POJO/kotlin数据类),它保存json文档的结构(比如说MyContent)
  2. 实现一个写入和读取转换器,将POJO转换为字符串(例如在jackson的帮助下)
  3. 借助组织指定postgres列类型。postgresql。util。PGobject

详细信息(仅伪代码):

import org.springframework.core.convert.converter.Converter
import org.springframework.data.convert.ReadingConverter
import org.springframework.data.convert.WritingConverter
import com.fasterxml.jackson.databind.ObjectMapper
import org.postgresql.util.PGobject

@Table("my_entity")
data class MyEntity(
  @Id val id: UUID,
  val content: MyContent
) {

  @WritingConverter
  class EntityWritingConverter(
      private val objectMapper: ObjectMapper
  ) : Converter<MyContent, PGobject> {
      override fun convert(source: MyContent): PGobject? {
          val jsonObject = PGobject()
          jsonObject.type = "json"
          jsonObject.value = objectMapper.writeValueAsString(source)
          return jsonObject
      }
  }

  @ReadingConverter
  class EntityReadingConverter(
      private val objectMapper: ObjectMapper
  ) : Converter<PGobject, MyContent> {
      override fun convert(pgObject: PGobject): MyContent {
          val source = pgObject.value
          return objectMapper.readValue<MyContent>(source)
      }
  }
}

不要忘记将这两个转换器添加到spring data jdbc的配置中(请参见JdbcCustomConversions)。

这适用于此相应的postgres表:

sql prettyprint-override">create table if not exists my_entity
(
    id uuid not null primary key,
    content jsonb
);

 类似资料:
  • 问题内容: 这个问题的目的是记录: 在PySpark中使用JDBC连接读取和写入数据所需的步骤 JDBC源可能存在的问题以及已知的解决方案 只要稍作更改,这些方法就可以与其他支持的语言一起使用,包括Scala和R。 问题答案: 写数据 提交应用程序或启动Shell时,包括适用的JDBC驱动程序。您可以使用例如: 或结合和 也可以在启动JVM实例之前使用环境变量来设置这些属性,或使用set或/来设置

  • 本文向大家介绍python如何读写json数据,包括了python如何读写json数据的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了python读写json数据的具体代码,供大家参考,具体内容如下 案例:   在web应用中常常用到json数据进行传输数据,本质上是字典类型数据转换成字符串,通过字符串进行网页传输,然后把接收到的字符串转换成字典类似数据   需求:实现字典转换成字符

  • 这个问题的目的是记录: > 在PySpark中使用JDBC连接读写数据所需的步骤 JDBC源代码和已知解决方案可能存在的问题 只要稍作改动,这些方法就可以与其他受支持的语言(包括Scala和R)一起使用。

  • 问题内容: 如何从Sql数据库读取MP3。在SQL中,我已经将文件存储为二进制格式。现在我想检索存储在sql中的Mp3文件,并显示在我的aspx页面中。如何???? 请帮助… 问题答案: 以最简单的形式,这就是您将如何获取原始字节的方法,如果不知道您想要的内容,将无法显示更多内容……

  • 主要内容:日期和时间数据类型,处理NULL值JDBC驱动程序将Java数据类型转换为适当的JDBC类型,然后将其发送到数据库。 它为大多数数据类型提供并使用默认映射。 例如,Java 类型会被转换为SQL 。 创建默认映射以提供到驱动程序时保持一致性。 下表总结了当调用或对象或方法的方法时,将Java数据类型转换为的默认JDBC数据类型。 SQL类型 JDBC/Java类型 setXXX updateXXX VARCHAR java.lan

  • 问题内容: 我正在努力寻找一个很好的例子,说明如何使用GSON在我的android应用中读取和写入数据。有人可以告诉我还是给我指出一个好榜样?我将其用于活动之间的数据持久性。 我的教授举这个例子来写: 我将如何将其保存到文件中? 问题答案: 如何将JSON保存到内部存储中的文件中: 如何读回: