是否可以将 Hibernate 与 PostgreSql 的 JSONB 数据类型一起使用?

Posted

技术标签:

【中文标题】是否可以将 Hibernate 与 PostgreSql 的 JSONB 数据类型一起使用?【英文标题】:Is it possible to use Hibernate with PostgreSql's JSONB data type? 【发布时间】:2018-08-25 19:39:58 【问题描述】:

Hibernate 5 默认不支持 PostgreSQL jsonb 数据类型。

有没有办法实现jsonb 对 Hibernate + Spring JPA 的支持?

如果有办法,在 Hibernate 中使用 jsonb 的优缺点是什么?

【问题讨论】:

请不要忘记接受/支持对您有帮助的答案... 是的,当然。感谢您的帮助:) 【参考方案1】:

感谢Vlad Mihalcea我们有这样的机会! )

他创建了hibernate-typeslib:

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>2.1.1</version>
</dependency> 

为 Hibernate 添加了对 'json'、'jsonb' 和其他类型的支持:

@Data
@NoArgsConstructor
@Entity
@Table(name = "parents")
@TypeDefs(
        @TypeDef(name = "string-array", typeClass = StringArrayType.class),
        @TypeDef(name = "int-array", typeClass = IntArrayType.class),
        @TypeDef(name = "json", typeClass = JsonStringType.class),
        @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
)
public class Parent implements Serializable 

    @Id
    @GeneratedValue(strategy = SEQUENCE)
    private Integer id;

    @Column(length = 32, nullable = false)
    private String name;

    @Type(type = "jsonb")
    @Column(columnDefinition = "jsonb")
    private List<Child> children;

    @Type(type = "string-array")
    @Column(columnDefinition = "text[]")
    private String[] phones;

    public Parent(String name, List<Child> children, String... phones) 
        this.name = name;
        this.children = children;
        this.phones = phones;
    


@Data
@NoArgsConstructor
@AllArgsConstructor
public class Child implements Serializable 
    private String name;

更多信息:1、2

【讨论】:

感谢@Cepr0 的回答。实际上,这个库是否支持按对象字段搜索?正如我所看到的,这个库非常原始,社区也不是很大,它可靠吗? @Aventes Vlad 是Hibernate authors 之一 @Aventes Hibernate Types framework 拥有超过 750 颗 GitHub 星,每月下载量超过 40 万。因此,社区相当大,因为 Hibernate Types 框架提供了对 JSON、ARRAY、Inet、HStore、TSVector、DBs-specific Enums、YearMonth 和许多其他功能的支持。 @VladMihalcea 为什么 Hibernate 不支持这些类型?因为它们不是标准的sql类型? JSON 和 ARRAY 是标准的,但并非 Hibernate 支持的所有数据库都支持。有一天,它可能会支持。同时,你使用了 Hibernate Types 项目。【参考方案2】:

@Cepr0-s 答案是正确的,但我遇到了一些问题。尝试将其与 PostgreSQL org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111 一起使用时遇到异常。就我而言,解决此问题的方法是添加自定义休眠方言。 This 资源可能会有所帮助。

// CustomPostgreSQLDialect.java
public class CustomPostgreSQLDialect extends PostgreSQL10Dialect 

    public CustomPostgreSQLDialect() 
        super();
        registerHibernateType(Types.OTHER, StringArrayType.class.getName());
        registerHibernateType(Types.OTHER, IntArrayType.class.getName());
        registerHibernateType(Types.OTHER, JsonStringType.class.getName());
        registerHibernateType(Types.OTHER, JsonBinaryType.class.getName());
        registerHibernateType(Types.OTHER, JsonNodeBinaryType.class.getName());
        registerHibernateType(Types.OTHER, JsonNodeStringType.class.getName());
    

-

# application.yml
spring:
  jpa:
    properties:
      hibernate:
        dialect: "com.test.CustomPostgreSQLDialect"

【讨论】:

以上是关于是否可以将 Hibernate 与 PostgreSql 的 JSONB 数据类型一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

postgre数据库备份与恢复

Ubuntu下postgre与postgis安装

休眠 2 与 MSSQL 用于 ORDER BY

postgre与mysql区别

通过hibernate访问postgreSQL的搭建过程

将 Postgre 查询转换为 Hive/Mysql