Jsonb类型

PostgresSql支持两种JSON数据类型:json和jsonb。json类型以文本形式存储json对象,输入的文本是什么样的,存储的文本就是什么样的。每次处理时需要解析和分析文本格式的json,另外还存储了不必要的空白字符和重复键。jsonb类型将文本格式的json对象转换为二进制格式,并删除了不需要的空格及重复键。如果在输入中指定了重复的健,只有最后一个值会被保留。

最重要的一点:jsonb支持索引

通常情况下,选择用jsonb就可以,除非有特殊需求,比如对键值的顺序有要求。

操作

创建数据库并插入几条数据:

CREATE TABLE book (id SERIAL PRIMARY KEY,client TEXT NOT NULL,data JSONb NOT NULL
);INSERT INTO book(client, data) values
('Joe', '{ "title": "Siddhartha", "author": { "first_name": "Herman", "last_name": "Hesse"} }'),
('Jenny', '{ "title": "Dharma Bums", "author": { "first_name": "Jack", "last_name": "Kerouac"} }'),
('Jenny', '{ "title": "100 años de soledad", "author": { "first_name": "Gabo", "last_name": "Marquéz"} }');SELECT * FROM book;

查询

->

select client, data->'title' as title, data->'author' as author from book;

结果如下:

client title author
Joe "Siddhartha" {"first_name": "Herman", "last_name": "Hesse"}
Jenny "Dharma Bums" {"first_name": "Jack", "last_name": "Kerouac"}
Jenny "100 años de soledad" {"first_name": "Gabo", "last_name": "Marquéz"}

->>

select client, data->>'title' as title, data->'author'->>'first_name' as author from book;

结果如下:

client title author
Joe Siddhartha Herman
Jenny Dharma Bums Jack
Jenny 100 años de soledad Gabo

->->> 两种操作返回的结果可以看出,前者返回json对象,后者返回文本值。这两个操作对json字段同样适用。

嵌套过滤

select client, data->>'title' as title from book where data->'author'->>'last_name' = 'Kerouac';

返回结果:

client title
Jenny Dharma Bums

其他操作

json和jsonb都支持

jsonb支持

举例查询:

select * from book where data @> '{"title": "Dharma Bums","author": {"last_name": "Kerouac","first_name": "Jack"}}'::jsonb;

结果如下:

id client data
2 Jenny {"title":"Dharma Bums","author":{"last_name":"Kerouac","first_name":"Jack"}}

更新

update book set data = jsonb_set(data, '{author, first_name}', '"Hermany"') where id = 1;

再来查询更新后的结果:

id client data
1 Joe {"first_name": "Hermany", "last_name": "Hesse"}

使用JPA持久化jsonb字段

添加JSONBinary库:

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

假设现在有一个Person的entity,其中有一个preference对象字段,需要按jsonb格式存储到数据库。需要在Person类和preference字段上使用jsonb的注解:

@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
public class Person {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;@Column(columnDefinition = "jsonb")@Type(type = "jsonb")private Preference preference;
}

然后正常使用save函数就能就行保存和更新了。

Postgres中jsonb类型相关推荐

  1. json和jsonb类型——PostgreSQL

    PostgreSQL支持两种json数据类型:json和jsonb,而两者唯一的区别在于效率,json是对输入的完整拷贝,使用时再去解析,所以它会保留输入的空格,重复键以及顺序等.而jsonb是解析输 ...

  2. 在Postgres中为插入语句生成UUID?

    本文翻译自:Generating a UUID in Postgres for Insert statement? My question is rather simple. 我的问题很简单. I'm ...

  3. golang之jsonb类型的支持

    golang之jsonb类型的支持 jsonb是一个很好的存储方式,可以省去我们很多的数据库复杂设计,简化架构.那么我们在golang中如何使用? 当然我们是不能直接使用的,所以这篇文章将指导你在go ...

  4. PostgreSQL中JSONB的索引

    JSONB类型的列上可以直接建索引,支持BTree索引和GIN索引.其中,GIN索引可以高效的从JSONB内部的key/value对中搜索数据,因此JSONB类型上常用GIN索引. JSONB上创建G ...

  5. 10.数据类型-json/jsonb类型

    文章目录 前言 一.json/jsonb类型 1.json类型简介 2.查询json数据 3.jsonb与json差异 4.jsonb与json操作符 5.jsonb与json函数 6.jsonb键/ ...

  6. postgresql 15源码浅析(1)—— postgres中的1号数据库

    摘要 在创建数据库集簇后,该集簇中默认会包含三个系统数据库template1.template0和postgres,其中template0和postgres都是在初始化过程中从template1复制出 ...

  7. 全面理解Python中的类型提示(Type Hints)

    众所周知,Python 是动态类型语言,运行时不需要指定变量类型.这一点是不会改变的,但是2015年9月创始人 Guido van Rossum 在 Python 3.5 引入了一个类型系统,允许开发 ...

  8. 《挑战30天C++入门极限》新手入门:C/C++中枚举类型(enum)

        新手入门:C/C++中枚举类型(enum) 如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型.之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来. ...

  9. 【C++】 66_C++ 中的类型识别

    类型识别 在面向对象中可能出现下面的情况 基类指针指向子类对象(赋值兼容性) 基类引用成为子类对象的别名(赋值兼容性) 静态类型 - 变量(对象)自身的类型[编译期可确定] 动态类型 - 指针(引用) ...

最新文章

  1. labview实现简单的图片显示
  2. MAP(Mean Average Precision):
  3. Symfony 4.3 发布,带来搜索引擎自动保护
  4. 基础数据类型操作(一)——整型、字符串
  5. 温故知新,.Net Core遇见WinForms客户端窗体框架,在DotNet Core大一统基础上老树发芽...
  6. GitBucket管理员添加人员
  7. java中的extends_Java中的继承
  8. Day3 01 枚举
  9. Performance --- 前端性能监控
  10. 找回密码forget_password
  11. 图解 Java IO : 一、File源码
  12. php 实现顺序查找
  13. SQL注入理解与防御
  14. CentOS 7 yum update 报错 Failed to connect to 2404:6800:4012::200e: Network is unreachable
  15. Linux 克隆虚拟机以及克隆之后引起的“Device eth0 does not seem to be present, delaying initialization”问题解决...
  16. 如何把桌面计算机和回收站隐藏,电脑回收站怎么隐藏图标,隐藏我的电脑和回收站...
  17. QTextEdit的使用
  18. Javascript技巧大集合(转自http://www.mscto.com/JavaScript/041043806.html)
  19. 总结:MUSTer中的keypoint matching以及利用RANSAC去除outliers
  20. DAY41:Cobalt Strike 工具使用

热门文章

  1. 在Jupyter上不仅看直播视频还玩CSS动画,就是这么炫酷
  2. [组图]一切从零开始 Symbian智能机之软件入门(转)
  3. 齿轮和轴的介绍 外文翻译
  4. Ubuntu显示桌面时,Screenlets桌面工具隐藏问题解决
  5. YolactEdge:边缘设备上的实时实例分割(Xavier: 30 FPS, RTX 2080 Ti:170 FPS)
  6. Could not register branch into global session xid = %s
  7. matlab 脸部血容积脉搏波,基于光电容积脉搏波的抗运动心率及血氧提取算法研究...
  8. android跳转到qq页面显示,安卓仿QQ登录及登录成功界面跳转
  9. mulesoft Module 4 quiz解析
  10. 自动驾驶系列(十九)Autoware使用YoloV3识别(海康相机)