如何修改Spring Data底层查询实现String与PostgreSQL jsonb自动类型映射
PostgreSQL jsonb与Java String类型映射解决方案
依赖配置
Hibernate 5.x 版本
需额外引入Hibernate Types工具包,Maven配置如下:
<!-- 需根据你使用的Hibernate版本选择对应依赖,以下为Hibernate 5.4.x 示例 --> <dependency> <groupId>com.vladmihalcea</groupId> <artifactId>hibernate-types-54</artifactId> <version>2.21.1</version> </dependency>
Hibernate 6.x 版本
内置JSON类型处理器,无需额外引入依赖。
实体类正确配置
Hibernate 5.x 版本
修正@TypeDef的类型指向JsonBinaryType即可:
import com.vladmihalcea.hibernate.type.json.JsonBinaryType; import org.hibernate.annotations.Type; import org.hibernate.annotations.TypeDef; import javax.persistence.*; @Entity @Table(name = "a", catalog = "") @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class) public class A { @Type(type = "jsonb") @Column(name = "json-data", columnDefinition = "jsonb") private String myJsonData; // 省略构造方法、getter、setter }
Hibernate 6.x 版本
直接使用@JdbcTypeCode注解即可完成自动映射:
import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.type.SqlTypes; import jakarta.persistence.*; @Entity @Table(name = "a", catalog = "") public class A { @JdbcTypeCode(SqlTypes.JSON) @Column(name = "json-data", columnDefinition = "jsonb") private String myJsonData; // 省略构造方法、getter、setter }
原配置错误原因
你之前的配置中将@TypeDef的typeClass指定为String.class,Hibernate会使用默认的基础类型处理器处理该字段,参数传入数据库时会被识别为普通字符串/字节类型,和PostgreSQL的jsonb类型不匹配。使用专门的JSON类型处理器后,Hibernate会自动完成Java类型到数据库jsonb类型的适配,无需手动在SQL中添加::jsonb强转。
内容的提问来源于stack exchange,提问作者MHM
相关产品推荐
相关产品推荐

