【发布时间】:2021-07-27 21:27:08
【问题描述】:
我很难在 Spring Data 中使用带有 JsonB 数据类型的 PostgreSQL。我有下表:
create table mytable (
...
MYDATA JsonB not null,
...
);
然后,我有以下实体:
@Entity
@Table(name = "mytable")
...
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
public class MyEntity {
...
@NotNull
@Type(type = "jsonb")
@Column(name = "MYDATA", nullable = false)
private MyAbstractData myAbstractData;
...
}
MyAbstractData 定义如下:
...
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@Type(value = MyConcreteData.class, name = "data")
})
...
public abstract class MyAbstractData implements Serializable {
private String key;
...
}
最后但同样重要的是,MyConcreteData 如下所示:
public class MyConcreteData extends MyAbstractData {
...
}
我的仓库如下:
@Repository
public interface MyEntityRepo extends CrudRepository<MyEntity, Long> {
public Optional<MyEntity> findByIdAndSomething (Long id, Something something);
}
在数据库中,我可以插入值,例如,'{"type":"data","key":"i1"}' 但是,执行以下操作:
Optional<MyEntity> myEntity = myEntityRepo.findByIdAndSomething(1L, something);
我得到以下异常:
org.springframework.orm.hibernate5.HibernateSystemException: java.lang.IllegalArgumentException: The given string value: "{\"type\":\"data\",\"key\":\"i1\"}" cannot be transformed to Json object; nested exception is org.hibernate.HibernateException: java.lang.IllegalArgumentException: The given string value: "{\"type\":\"data\",\"key\":\"i1\"}" cannot be transformed to Json object
但是,我能够使用 fasterxml ObjectMapper 成功序列化/反序列化 MyConcreteData 类,并从字符串“{“type”:“data”,“key”:“i1”}”创建一个有效的 JsonNode。
我知道我的案子可能很难跟进,但我仍然希望有人能提供帮助。
非常感谢。
西摩
【问题讨论】:
-
只是提一下,与我在这里所说的相反,在集成测试期间,使用 H2 数据库时会引发上述异常。因此,如前所述,它不会出现在 PostgreSQL 中,而是在集成测试期间出现在 H2 中。据我所知,这应该不是问题,因为 H2 支持 JsonB。
标签: json postgresql spring-data-jpa spring-data