如何使用PostgreSQL中的JSONB数据类型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用PostgreSQL中的JSONB数据类型相关的知识,希望对你有一定的参考价值。
参考技术A ostgreSQL9.4正在加载一项新功能叫jsonb,是一种新型资料,可以储存支援GIN索引的JSON资料。换言之,此功能,在即将来临的更新中最重要的是,如果连这都不重要的话,那就把Postgres置于文件为本数据库系统的推荐位置吧。自从9.2开始,一个整合JSON资料类型已经存在,带有一整套功能(例如资料产生和资料解构功能),还有9.3新增的操作者。当使用JSON资料类型,资料的被存储成一完全一样的副本,功能还在此之上运作,还另外需要后台运作的重新分析。这心得JSONB资料类型以已降解的2元格式存储,所以,插入此资料会比JSON高效,因为后台不再需要重新分析,因此让它更快速运行,而且还兼顾GIN索引。就是因为最后这个原因,我们实际上建议读者使用jsonb来代替json制作程式(当然你还可以因应需要而使用json)。请记住jsonb使用相同的操作者和功能,读者们可以看我之前的帖子去令你得到些什么启发(或者干脆看Postgres的文件)。是否可以将 Hibernate 与 PostgreSql 的 JSONB 数据类型一起使用?
【中文标题】是否可以将 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"
【讨论】:
以上是关于如何使用PostgreSQL中的JSONB数据类型的主要内容,如果未能解决你的问题,请参考以下文章
如何逃脱? (问号)运算符在 Rails 中查询 Postgresql JSONB 类型
postgresql jsonb的实体框架核心中的等效数据类型
如何从 PostgreSQL 中的 JSONB 数组中获取特定对象的值?
使用 jsonb 数据类型的 PostgreSQL 插入查询