PostgreSQL使用JPA和Hibernate抛出“列的类型为jsonb,而表达式的类型为bytea”

时间:2018-12-19 09:13:40

标签: java postgresql hibernate jpa jsonb

这是我的实体类,已映射到postgres(9.4)中的表 我正在尝试将jsonb类型的元数据存储在数据库中

@Entity
@Table(name = “room_categories”)
@TypeDef(name = “jsonb”, typeClass = JsonBinaryType.class)
public class RoomCategory extends AbstractEntity implements Serializable {
    private String name;
    private String code;
    @Type(type = "jsonb")
    @Column(columnDefinition = "json")
    private Metadata metadata;

}

这是元数据类:

public class Metadata implements Serializable {
    private String field1;
    private String field2;

}

我已使用以下迁移文件来添加jsonb列:

databaseChangeLog:
– changeSet:
id: addColumn_metadata-room_categories
author: arihant
changes:
– addColumn:
schemaName: public
tableName: room_categories
columns:
– column:
name: metadata
type: jsonb

postgres中创建记录时遇到此错误: 错误:列“元数据”的类型为jsonb,但表达式的类型为bytea 提示:您将需要重写或强制转换表达式。

这是我要保留在db中的请求正文:

  {
    “name”: “Test102”,
    “code”: “Code102”,
    “metadata”: {
    “field1”: “field11”,
    “field2”: “field12”
    }
    }

请帮助如何在Java Spring Boot应用中将bytea类型转换为jsonb

2 个答案:

答案 0 :(得分:2)

通过ObjectMapper将对象简单地转换为json字符串,然后将(:: jsonb)转换为jsonb类型:

INSERT INTO room_categories (name, code, metadata)
    VALUES (?, ?, ? ::jsonb ); 

(您将需要使用本机查询来查询存储为jsonb的数据)

答案 1 :(得分:0)

如果要使用hbm2ddl生成模式,请确保也在jsonb级别使用@Column类型:

@Column(columnDefinition = "jsonb")

现在,与您的问题有关:

  

我在postgres中创建记录时遇到此错误:错误:“元数据”列的类型为jsonb,但表达式的类型为bytea提示:您将需要重写或强制转换表达式。

尚不清楚何时收到此错误。因此,这是您需要做的:

  1. 转到hibernate-types项目并对其进行分叉,
  2. 修改PostgreSQLJsonBinaryTypeTest以复制您的问题。
  3. 发送带有复制测试用例的请求请求。

随后,我将对其进行介绍并提供更多详细信息。