You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot:解决PostgreSQL Jsonb列存储字符串属性报错问题

解决SpringBoot JPA字符串属性存入PostgreSQL Jsonb列的类型不匹配问题

方案1:正确实现JPA属性转换器(AttributeConverter)

多数情况下转换器未生效是因为实现或配置有误,以下是标准写法:

  • 编写转换器类,指定转换目标为PostgreSQL的PGobject并设置类型为jsonb:
import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter;
import org.postgresql.util.PGobject;
import java.sql.SQLException;

@Converter(autoApply = true) // 自动应用到所有字符串转jsonb的属性
public class StringToJsonbConverter implements AttributeConverter<String, PGobject> {

    @Override
    public PGobject convertToDatabaseColumn(String attribute) {
        PGobject jsonbObject = new PGobject();
        jsonbObject.setType("jsonb");
        try {
            jsonbObject.setValue(attribute);
        } catch (SQLException e) {
            throw new RuntimeException("字符串转jsonb失败", e);
        }
        return jsonbObject;
    }

    @Override
    public String convertToEntityAttribute(PGobject dbData) {
        return dbData != null ? dbData.getValue() : null;
    }
}
  • 实体类属性配置(若未开启autoApply,需手动指定转换器):
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@Entity
public class YourEntity {
    @Id
    private Long id;

    @Column(columnDefinition = "jsonb")
    @Convert(converter = StringToJsonbConverter.class)
    private String jsonData;

    // getter、setter方法
}

注意:Spring Boot 3+需使用jakarta.persistence包,而非旧版javax.persistence;同时确保PostgreSQL驱动版本≥42.5.0。

方案2:使用Hibernate内置JsonType(无需自定义转换器)

Hibernate 5.2+提供了内置的JsonType,可直接映射字符串到jsonb列:

  • 实体类配置:
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;
import com.vladmihalcea.hibernate.type.json.JsonType;

@Entity
@TypeDef(name = "jsonb", typeClass = JsonType.class)
public class YourEntity {
    @Id
    private Long id;

    @Column(columnDefinition = "jsonb")
    @Type(type = "jsonb")
    private String jsonData;

    // getter、setter方法
}
  • 引入对应依赖(Maven示例):
<!-- Spring Boot 2.4+ 搭配Hibernate 5.5+ -->
<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-55</artifactId>
    <version>2.19.0</version>
</dependency>

<!-- Spring Boot 3+ 搭配Hibernate 6+ -->
<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-60</artifactId>
    <version>2.19.0</version>
</dependency>

方案3:SQL层面强制转换(应急方案,不推荐)

若以上方案均无效,可在自定义Repository查询中手动添加类型转换:

import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;

public interface YourEntityRepository extends CrudRepository<YourEntity, Long> {

    @Modifying
    @Query(value = "INSERT INTO your_entity (id, json_data) VALUES (?1, ?2::jsonb)", nativeQuery = true)
    void saveWithJsonbCast(Long id, String jsonData);
}

关键排查点

  • 确认数据库列类型确实为jsonb,而非json或varchar
  • 实体类@Column注解的columnDefinition需明确指定jsonb
  • 检查转换器是否被Spring正确管理(类上是否有@Converter注解)
  • 确保待存储的字符串是合法JSON格式(如双引号包裹键名、结构正确)

内容的提问来源于stack exchange,提问作者Ashutosh Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 06:48:28