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

使用Spring/JPA写入Postgres数据库的JSON列

丁曦哲
2023-03-14

我有一个名为“test”的表,其中包含Postgres 9.3中json类型的“sample_column”列。我试图使用Spring/JPA将以下内容写入该列:{“name”:“Updated name”}

我在其他帖子上读到,我需要添加一个自定义转换器来将字符串映射到json类型。这是我现在拥有的代码:

TestDAO。爪哇:

@Entity
@Table(name="test")
public class TestDAO implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="id", unique=true, nullable=false)
    private Long id;   

    @Column(name="sample_column")
    @Convert(converter = MyCustomConverter.class)
    private MyCustomClass sampleColumn;

    // Getter / Setters
}

用于映射json内容的CustomClass:

public class MyCustomClass {
    @JsonProperty("name")
    public String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

最后是ConverterClass:

@javax.persistence.Converter
public class MyCustomConverter implements AttributeConverter<MyCustomClass, String> {

    private final static ObjectMapper objectMapper = new ObjectMapper();

    @Override
    @NotNull
    public String convertToDatabaseColumn(@NotNull MyCustomClass myCustomObject) {
        try {
            return objectMapper.writeValueAsString(myCustomObject);
        } catch (Exception ex) {
            return null;
        }
    }

    @Override
    @NotNull
    public MyCustomClass convertToEntityAttribute(@NotNull String databaseDataAsJSONString) {
        try {
            return objectMapper.readValue(databaseDataAsJSONString, MyCustomClass.class);
        } catch (Exception ex) {
            return null;
        }
    }
}

现在,我尝试按如下方式设置json列:

testDAO.getSampleColumn().setName("Updated name");
testRepository.saveAndFlush(testDAO);

但是当我试图保存它时,我得到以下错误:

Caused by: org.postgresql.util.PSQLException: ERROR: column "sample_column" is of type json but expression is of type character varying
  Hint: You will need to rewrite or cast the expression.

但是,我能够使用testDAO读取JSON列。getSampleColumn()。getName() 这里有什么问题?我不想在表中添加任何强制转换,以便自动将变量转换为Json。

谢谢


共有3个答案

狄玮
2023-03-14

虽然这两种方法都有效,但我建议使用PGobject功能,而不是在连接级别设置该功能。

final ObjectMapper objectMapper = new ObjectMapper();
PGobject languageObject = new PGobject();
languageObject.setType("json");
languageObject.setValue(objectMapper.writeValueAsString(blogPosts.getLanguages()));

完成后,将参数传递给Spring jdbc模板以执行魔术

希望这个。

燕鸿文
2023-03-14

对于使用Spring boot的人来说,有两种方法可以做到@Craig Ringer所说的

spring.datasource.url=jdbc:postgresql://localhost:5432/postgres?stringtype=unspecified

或使用属性

spring.datasource.hikari.data-source-properties.stringtype=unspecified
卫飞鹏
2023-03-14

您将需要在JDBC级别使用setObject,或者传递PgJDBC参数stringtype=未指定的,以允许从字符串类型到json等的隐式转换。

PostgreSQL对类型转换过于严格是一个问题。

 类似资料:
  • 我有一个postgres数据库,包含一个名为“users”的表。该表有四个字段: id BIGSERIAL主键 显示名称文本不为空, 电子邮件文本不为空 电话号码文本 我想从dart代码中添加数据。我的尝试是这样的: 问题是我遇到了一个例外 (PostgreSQLSeverity.error 42601:在“display_name”处或附近出现语法错误)

  • 问题内容: 我正在尝试配置Spring + Hibernate + JPA以使用两个数据库(MySQL和MSSQL)。 我的datasource-context.xml: 每个persistence.xml包含一个单元,如下所示: PersistenceUnitManager导致以下异常: 如果只留下一个没有列表的persistence.xml,则每个列表都可以正常工作,但我需要2个单元… 我还尝

  • 我正在尝试创建一个表: create表格生成DATE raw(255)not null,我需要它是DATE,我读入它并试图创建一个转换器: 但一切都没有改变,我错过了什么?

  • 我有相同的数据库模式database_1和database_2,希望对这两个数据库进行配置(database schema相同),并确定使用哪个数据库的运行时<我的坚持。xml如下所示: 持久性名称第二个配置如下: 两个持久性单元加载相同的类。现在我的数据库配置。xml作为配置持久化单元和数据源的地方。如下所示,第一个持久化单元名称配置为,数据源名称为datasource: 现在,此代码用于将第二

  • 我正在努力让Spring JPA Data为我工作,但一直在努力。问题出在这里。 我有两个域类,它们之间有一个简单的一对多关系: 我已经为每个类设置了存储库接口:CardRepository,扩展JpaRepository的用户存储库,两个存储库都注入到服务中 非常基本的设置。someMethod() 出现问题,其中我用它的标识符查询了一个用户,然后尝试获取映射@OneToMany的列表,然后发生

  • 我有一个包含String[]和Time[]数组列的表。从桌子上看书很好。但当我想创造一张唱片的时候... null