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

作者:编程家 分类: postgresql 时间:2025-10-23

使用JPA和Hibernate来访问和操纵PostgreSQL数据库是一种常见的方式。然而,有时候在使用JPA和Hibernate时会遇到一些问题。其中一个常见的问题是在处理jsonb类型的列时抛出异常:“列的类型为jsonb,但表达式的类型为bytea”。

在使用JPA和Hibernate时,我们经常遇到需要将JSON数据存储在数据库中的情况。PostgreSQL数据库提供了一种称为jsonb的数据类型,它允许我们存储和查询JSON数据。然而,当我们尝试将jsonb类型的列与bytea类型的表达式进行比较时,就会出现上述异常。

这个问题的根本原因是JPA和Hibernate默认将jsonb类型的列映射为bytea类型。因此,当我们尝试使用JPA和Hibernate进行查询时,它们会将jsonb类型的列解析为bytea类型,导致类型不匹配的异常。

为了解决这个问题,我们需要告诉JPA和Hibernate正确地将jsonb类型的列映射为jsonb类型,而不是bytea类型。下面是一个解决这个问题的示例代码:

java

import com.vladmihalcea.hibernate.type.json.JsonBinaryType;

import org.hibernate.annotations.Type;

import org.hibernate.annotations.TypeDef;

import javax.persistence.*;

@Entity

@Table(name = "my_table")

@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)

public class MyEntity {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private Long id;

@Column(name = "data", columnDefinition = "jsonb")

@Type(type = "jsonb")

private String data;

// getters and setters

}

在这个示例代码中,我们使用了一个名为JsonBinaryType的自定义类型来映射jsonb类型的列。通过在实体类上使用@TypeDef注解,我们告诉Hibernate将JsonBinaryType作为jsonb类型的映射器。

接下来,在要映射为jsonb类型的列上使用@Column注解,并将columnDefinition属性设置为"jsonb",这样JPA和Hibernate就会正确地将该列映射为jsonb类型。

通过这样的配置,我们就能够正确地使用JPA和Hibernate来操作和查询PostgreSQL数据库中的jsonb类型的列,而不会抛出“列的类型为jsonb,但表达式的类型为bytea”的异常。

解决“列的类型为jsonb,但表达式的类型为bytea”异常

在使用JPA和Hibernate访问PostgreSQL数据库时,处理jsonb类型的列时可能会遇到异常:“列的类型为jsonb,但表达式的类型为bytea”。这个问题的原因是JPA和Hibernate默认将jsonb类型的列映射为bytea类型,导致在查询时出现类型不匹配的异常。

为了解决这个问题,我们可以使用自定义类型来正确地将jsonb类型的列映射为jsonb类型。首先,我们需要创建一个自定义类型来处理jsonb数据的映射。这个自定义类型需要实现Hibernate的UserType接口,并在实现类中处理jsonb类型的转换。

然后,我们需要在实体类上使用@TypeDef注解,并指定我们创建的自定义类型作为jsonb类型的映射器。此外,我们还需要在要映射为jsonb类型的列上使用@Column注解,并将columnDefinition属性设置为"jsonb",以告诉JPA和Hibernate正确地将该列映射为jsonb类型。

通过这样的配置,我们就能够正确地使用JPA和Hibernate来操作和查询PostgreSQL数据库中的jsonb类型的列,而不会抛出“列的类型为jsonb,但表达式的类型为bytea”的异常。

这是一个示例代码,展示了如何解决这个问题:

java

import com.vladmihalcea.hibernate.type.json.JsonBinaryType;

import org.hibernate.annotations.Type;

import org.hibernate.annotations.TypeDef;

import javax.persistence.*;

@Entity

@Table(name = "my_table")

@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)

public class MyEntity {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private Long id;

@Column(name = "data", columnDefinition = "jsonb")

@Type(type = "jsonb")

private String data;

// getters and setters

}

在这个示例代码中,我们使用了一个名为JsonBinaryType的自定义类型来映射jsonb类型的列。通过在实体类上使用@TypeDef注解,我们告诉Hibernate将JsonBinaryType作为jsonb类型的映射器。

接下来,在要映射为jsonb类型的列上使用@Column注解,并将columnDefinition属性设置为"jsonb",这样JPA和Hibernate就会正确地将该列映射为jsonb类型。

通过以上的配置,我们就能够正确地使用JPA和Hibernate来操作和查询PostgreSQL数据库中的jsonb类型的列,而不会抛出“列的类型为jsonb,但表达式的类型为bytea”的异常。