MyBatis-Plus 查询PostgreSQL数据库jsonb类型保持原格式

news/2024/10/23 6:53:01/

文章目录

  • 前言
  • 数据库
  • 问题背景
    • 后端返回实体对象
    • 前端
  • 实现
    • 后端返回List<Map<String, Object>>
    • 前端


前言

在这篇文章,我们保存了数据库的jsonb类型:MyBatis-Plus 实现PostgreSQL数据库jsonb类型的保存与查询

这篇文章介绍了模糊查询json/jsonb类型:PostgreSQL 查询json/jsonb是否存在某个片段

在模糊查询json/jsonb之前,我们得拿到正确的json/jsonb片段,比如我们模糊查询好几个连着的键值对,如果我们拿到的键的顺序打乱了,我们想要一次性模糊查询json/jsonb数据就查询不到正确的数据了。

本文接下来将会讲解在MyBatis-Plus中如何实现返回给前端json/jsonb数据的键值对格式和数据库的格式一致。


数据库

这有一组jsonb类型的数据:

在这里插入图片描述

问题背景

后端返回实体对象

  • specialControl为jsonb类型

以下代码实现了数据返回接口,并可模糊查询jsonb类型

@GetMapping
@ResponseBody
public Object get(@RequestParam(value = "id", required = false) String id,@RequestParam(value = "name", required = false) String name,@RequestParam(value = "specialControl", required = false) String specialControl) {MPJQueryWrapper<Strategy> mpjQueryWrapper = new MPJQueryWrapper<>();mpjQueryWrapper.selectAll(Strategy.class).eq(StringUtil.isNotEmpty(id), "t.id", id).like(StringUtil.isNotEmpty(name), "t.name", name).orderByDesc("t.create_time");if (StringUtil.isNotEmpty(specialControl)) {mpjQueryWrapper.like("t.special_control::text", specialControl.replace(":", ": ").replace(",", ", "));}return strategyService.selectJoinList(Strategy.class, mpjQueryWrapper);
}

前端

序列化Json对象并输出

console.log(JSON.stringify(this.form.specialControl))

输出数据如下:

在这里插入图片描述

可以看到,content 内的键值对的顺序被打乱,和数据库的不一致。

实现

后端返回List<Map<String, Object>>

数据库列名为 special_control,前端数据为驼峰格式,需进行别名 special_control as \"specialControl\"

此时数据库的jsonb数据会被序列化返回给前端,所以jsonb的键值对顺序不会被打乱

  • 序列化:把对象转换为字节序列的过程称为对象的序列化
  • 反序列化:把字节序列恢复为对象的过程称为对象的反序列化
@GetMapping
@ResponseBody
public List<Map<String, Object>> get(@RequestParam(value = "id", required = false) String id,@RequestParam(value = "name", required = false) String name,@RequestParam(value = "specialControl", required = false) String specialControl) {MPJQueryWrapper<Strategy> mpjQueryWrapper = new MPJQueryWrapper<>();mpjQueryWrapper.select("t.id as id, t.name as name, t.special_control as \"specialControl\"").eq(StringUtil.isNotEmpty(id), "t.id", id).like(StringUtil.isNotEmpty(name), "t.name", name).orderByDesc("t.create_time");if (StringUtil.isNotEmpty(specialControl)) {mpjQueryWrapper.like("t.special_control::text", specialControl.replace(":", ": ").replace(",", ", "));}return strategyService.listMaps(mpjQueryWrapper);
}

前端

if (this.form.specialControl != null) {// 反序列化this.form.specialControl = JSON.parse(this.form.specialControl)// 序列化并输出console.log(JSON.stringify(this.form.specialControl))
} else {this.form.specialControl = []
}

输出数据如下:

在这里插入图片描述

即使前端JSON.parse()序列化了字节,再通过JSON.stringify()反序列化输出,可以看到顺序不会被打乱,和数据库的一致。

那么我们就可以直接拿到这一串数据和数据库进行模糊查询匹配。


http://www.ppmy.cn/news/989965.html

相关文章

Pycharm debug程序,跳转至指定循环条件/循环次数

在断点出右键&#xff0c;然后设置条件 示例 for i in range(1,100):a i 1b i 2print(a, b, i) 注意&#xff1a; 1、你应该debug断点在循环后的位置而不是循环上的位置&#xff0c;然后你就可以设置你的条件进入到指定的循环上了 2、设置条件&#xff0c;要使用等于符号…

iOS - 检测项目中无用类和无用图片

一、无引用图片检测 LSUnusedResources 安装插件 LSUnusedResources &#xff0c;用【My Mac】模拟器运行,如下图&#xff1a; Project Path 就是项目所在的路径&#xff0c;然后点击右下角 Search按钮&#xff0c;就可以看到被搜索出来的图片资源。 注意&#xff1a;这里被搜…

mysql的主从复制

1.主从复制的原理 主从复制的原理是通过基于日志的复制方式实现数据的同步。当主服务器上发生数据变更时&#xff0c;会将这些变更写入二进制日志&#xff08;Binary Log&#xff09;中。从服务器通过连接到主服务器&#xff0c;请求从主服务器获取二进制日志&#xff0c;并将…

C语言学习笔记---函数续章

C语言程序设计笔记---010 C语言函数 --- 续1、函数声明和函数的定义1.1、函数声明例程 2、函数递归2.1、错误递归&#xff0c;栈溢出例程2.2、函数递归练习例程12.3、递归的必要条件函数递归例程2 3、递归与迭代递归与迭代例程1递归与迭代例程2 4、结语 C语言函数 — 续 1、函…

Java基础_网络编程

Java基础_网络编程 网络编程三要素InetAddress网络模型 UDP通信程序单播发送数据接收数据聊天室 组播广播 TCPTCP通信程序三次握手和四次挥手 来源Gitee地址 网络编程三要素 IP: 设备在网络中的地址&#xff0c;是唯一的标识端口号: 应用程序在设备中唯一的标识。协议: 数据在…

只出现1次的数字(总结欢迎补充)

1.找只出现1次的数字,其余数出现n次 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现n次 。请你找出并返回那个只出现了一次的元素 当n等于2时 这道题可以使用异或运算来解决。我们知道&#xff0c;异或运算有以下性质&#xf…

【技巧】通过 CMD 走代理下载 Vue

通过 CMD 走代理下载 Vue 在学习或者工作中&#xff0c;有时上网走的是代理模式&#xff0c;就是在浏览器里面配置代理服务的那种。后来在下载 Vue 组件的时候显示请求超时。此时才发先&#xff0c;浏览器代理只能在浏览器里生效&#xff0c;cmd 中不生效&#xff0c;那该怎么办…

井字棋(TicTacToe)

目录 三种游戏 习题 1. 传统设置 2. 中间的网格 三种游戏 “选15”、“井字棋”、“魔幻15”游戏本质上是同一个游戏。 function tictactoe(job) % TICTACTOE Pick15, TicTacToe, and Magic3. % % Pick15. Pick single digit numbers. Each digit can be chosen % on…