我有一个名为“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。
谢谢
虽然这两种方法都有效,但我建议使用PGobject功能,而不是在连接级别设置该功能。
final ObjectMapper objectMapper = new ObjectMapper();
PGobject languageObject = new PGobject();
languageObject.setType("json");
languageObject.setValue(objectMapper.writeValueAsString(blogPosts.getLanguages()));
完成后,将参数传递给Spring jdbc模板以执行魔术
希望这个。
对于使用Spring boot的人来说,有两种方法可以做到@Craig Ringer所说的
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres?stringtype=unspecified
或使用属性
spring.datasource.hikari.data-source-properties.stringtype=unspecified
您将需要在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