已经有几个答案了,我相信它们适用于多种情况。我不想使用我不了解的任何其他依赖项,因此我寻找另一种解决方案。
重要的部分是AttributeConverter,它将来自数据库的jsonb映射到您的对象以及反之。因此,您必须使用@Convert注释JSONB列的属性,并将其链接到AttributeConverter,并添加@Column(columnDefinition = "jsonb"),这样JPA就知道在数据库中使用的类型。这应该已经可以启动Spring Boot应用程序了。但是,每当您尝试使用JpaRepository进行save()时,都会遇到问题。我收到了以下消息:
PSQLException: ERROR: column "myColumn" is of type jsonb but
expression is of type character varying.
Hint: You will need to rewrite or cast the expression.
这是因为Postgres太过严格地处理类型。
您可以通过更改配置来解决此问题:
datasource.hikari.data-source-properties: stringtype=unspecified
datasource.tomcat.connection-properties: stringtype=unspecified
之后,它对我非常有效,这里是一个最简示例。
我使用JpaRepositories:
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface MyEntityRepository extends JpaRepository<MyEntity, Integer> {
}
实体:
import javax.persistence.Column;
import javax.persistence.Convert;
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Integer id;
@Convert(converter = MyConverter.class)
@Column(columnDefinition = "jsonb")
private MyJsonObject jsonContent;
}
json的数据模型:
public class MyJsonObject {
protected String name;
protected int age;
}
转换器,我在这里使用的是Gson,但你可以按照自己的喜好进行映射:
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
@Converter(autoApply = true)
public class MyConverter implements AttributeConverter<MyJsonObject, String> {
private final static Gson GSON = new Gson();
@Override
public String convertToDatabaseColumn(MyJsonObject mjo) {
return GSON.toJson(mjo);
}
@Override
public MyJsonObject convertToEntityAttribute(String dbData) {
return GSON.fromJson(dbData, MyJsonObject.class);
}
}
SQL:
create table my_entity
(
id serial primary key,
json_content jsonb
);
我的application.yml(application.properties)文件:
datasource:
hikari:
data-source-properties: stringtype=unspecified
tomcat:
connection-properties: stringtype=unspecified