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

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

茅和玉
2023-03-14

这是我的实体类,映射到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中创建记录时出现此错误:错误:列“metadata”的类型为jsonb,但表达式的类型为bytea提示:您需要重写或强制转换表达式。

这是我试图在db中持久化的请求主体:

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

请帮助如何转换bytea类型为jsonb在javaSpring启动应用程序

共有2个答案

欧镜
2023-03-14

您可以获得以下PostgreSQL:

错误:列"元数据"的类型是jsonb,但表达式的类型是by tea提示:您需要重写或强制转换表达式。

如果您正在执行本机SQL DML语句。

例如,假设您想要执行以下操作:

int updateCount = entityManager.createNativeQuery("""
    UPDATE
        room_categories
    SET
        metadata = :metadata
    WHERE
        code = :code AND
        metadata ->> 'field1' is null            
    """)
.setParameter("code ", "123-ABC")
.setParameter(
    "metadata",
    new Metadata()
        .setField1("ABC")
        .setField2("123")
)
.executeUpdate();

bytea类型代表字节数组,由于元数据类型实现了Serializable接口,因此当没有其他类型更合适时,Hibernate会使用SerializableType

但是,由于无法将字节数组绑定到jsonb列,PostgreSQL会抛出上述错误。

要修复它,我们必须使用Hibernate特有的setParameterQuery方法显式设置JsonBinaryType

int updateCount = entityManager.createNativeQuery("""
    UPDATE
        room_categories
    SET
        metadata = :metadata
    WHERE
        code = :code AND
        metadata ->> 'field1' is null            
    """)
.setParameter("code ", "123-ABC")
.unwrap(org.hibernate.query.Query.class)
.setParameter(
    "metadata",
    new Metadata()
        .setField1("ABC")
        .setField2("123"),
    JsonBinaryType.INSTANCE
)
.executeUpdate();

首先,我们必须unwrapJPAQuery到Hibernateorg。冬眠查询查询并调用接受Hibernate类型实例的setParameter方法。

现在,Hibernate将知道元数据参数需要由JsonBinaryType处理,而不是由SerializableType处理。

全昊焜
2023-03-14

只需通过ObjectMapper将对象转换为json字符串,然后使用(::jsonb)转换为jsonb类型:

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

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

 类似资料:
  • 在Spring Boot的一个项目中,Java8使用hibernate-spatial和PostgresDB 9.4 应用程序属性 (我也尝试了PostgisPG9Dialect) 我的实体有一个属性 如果我用空值保存就可以了,但是如果我放一个值 我有: 在我的数据库中,我可以看到列定义为 我要疯了...为什么它不起作用? 更新(仍然不起作用,我正在收集新信息) 1)我认为问题可能是数据库的创建。

  • 问题内容: 在不同数据库之间进行切换时,关于包含大对象(BLOB)的hibernate映射,我有一个奇怪的问题。 上面的字段在MySQL和Oracle中创建一个字节数组字段,但是在PostreSQL中,它创建一个oid类型的字段。 现在,当我尝试访问该字段时,它在其他数据库中也能正常工作,但是在PostgreSQL中,它失败并显示以下错误 因此,我试图简单地删除“ @Lob”注释,这将解决Post

  • 我需要使用SpringDataJPA将实体类的两列映射为postgres中的json。阅读多个stackoverflow post和baeldung post后, 如何使用JPA将MapJSON列映射到Java对象 https://www.baeldung.com/hibernate-persist-json-object 我做了如下配置。但是,我面临错误"ERROR:列"标题"是json类型,但

  • 在我将PostgreSQL 13个数据库列标记更改为jsonb后,执行sql时抛出错误: 在使用mybatis时,我应该如何处理spring boot应用程序中的jsonb?

  • 我正在尝试使用nifi将CSV记录插入Postgres数据库。 示例csv文件: 当nifi场景运行时,它会给出以下错误 错误列“timenow”的类型为timestamp,没有时区,但表达式的类型为character variating 如果我使用正常的 没有错误值插入到表中。我必须更改nifi配置才能将其添加到表中吗? 我换了Nifi CSVReader- 编辑:在第一条注释之后,Nifi生成

  • 如果我以通常的方式声明一个类,我可以使用类名作为类型: 但是,如果我通过将类表达式分配给变量来声明一个类,我就不能将该名称用作类型: 建议使用不起作用,因为我想要的实例类型,而不是类本身的类型。 typescript操场示例 如何获取以第二种方式定义的类的实例类型? 我对以这种方式定义类感兴趣的原因是,我希望有一个接口来描述某些类将具有的静态方法,如此处的手册中所述(该部分中的第三个示例)。 下面