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

news2024/9/29 11:38:50

文章目录

  • 前言
  • 数据库
  • 问题背景
    • 后端返回实体对象
    • 前端
  • 实现
    • 后端返回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.coloradmin.cn/o/808271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端调用合约如何避免出现transaction fail

前言&#xff1a; 作为开发&#xff0c;你一定经历过调用合约的时候发现 gas fee 超出限制&#xff0c;但是不知道报了什么错。这个时候一般都是触发了require错误合约校验。对于用户来说他不理解为什么一笔交易会花费如此大的gas&#xff0c;那我们作为开发如何尽量避免这种情…

Power BI-网关设置与云端报表定时刷新(一)

网关的工作原理 网关是将本地数据传输至云端的桥梁&#xff0c;不仅Power BI能使用&#xff0c;其他微软软件也能够使用。 我们发布在云上的报表&#xff0c;发布后是静态的&#xff0c;不会自动刷新。需要通过网关设置定时刷新。 安装与设置 1.登录到Powerbi 在线服务–设置…

kaggle新赛:RSNA 2023 腹部创伤检测大赛赛题解析(CV)

赛题名称&#xff1a;RSNA 2023 Abdominal Trauma Detection 赛题链接&#xff1a; https://www.kaggle.com/competitions/rsna-2023-abdominal-trauma-detection 赛题背景 腹部钝力创伤是最常见的创伤性损伤类型之一&#xff0c;最常见的原因是机动车事故。腹部创伤可能导致…

大促之前全链路压测原理解析

1. 全链路压测的意义 上图为 2012 年淘宝核心业务应用关系的拓扑图&#xff0c;还不包含了其他的非核心业务应用&#xff0c;所谓的核心业务就是和交易相关的&#xff0c;和钱相关的业务&#xff0c;这张图大家可能看不清楚&#xff0c;看不清楚才是正常的&#xff0c;因为当时…

BGP实验

第一步&#xff1a;配置IP 第二步&#xff1a;写ospf 在R2&#xff0c;R3&#xff0c;R4&#xff0c;R5&#xff0c;R6&#xff0c;R7上分别配置ospf 如&#xff1a;R2 [R2]ospf 1 router-id 2.2.2.2 [R2-ospf-1]area 0 [R2-ospf-1-area-0.0.0.0]network 172.16.0.0 0.0.255…

wxwidgets Ribbon构建多个page与按钮响应

新建一个控制台应用程序&#xff0c;添加好头文件的依赖与lib库文件的依赖&#xff0c;修改属性&#xff1a; 将进入ribbon界面的文件与主界面的类分开&#xff1a; 1、RibbonSample.cpp #include "stdafx.h" #include "MyFrame.h" class MyApp : public…

谷粒商城第六天-商品服务之分类管理下的获取三级分类树形列表

目录 一、总述 1.1 前端思路 1.2 后端思路 二、前端部分 2.1 在网页中建好目录及菜单 2.1.1 建好商品目录 2.1.2 建好分类管理菜单 ​编辑 2.2 编写组件 2.2.1 先完成组件文件的创建 2.2.2 编写组件 2.2.2.1 显示三级分类树形列表 三、后端部分 3.1 编写商品分类…

二十章:基于弱监督语义分割的亲和注意力图神经网络

0.摘要 弱监督语义分割因其较低的人工标注成本而受到广泛关注。本文旨在解决基于边界框标注的语义分割问题&#xff0c;即使用边界框注释作为监督来训练准确的语义分割模型。为此&#xff0c;我们提出了亲和力注意力图神经网络&#xff08;A2GNN&#xff09;。按照先前的做法&a…

NO1.使用命令行创建Maven工程

①在工作空间目录下打开命令窗口 ②使用命令行生成Maven工程 mvn archetype:generate 运行 MVN 原型&#xff1a;生成命令,下面根据提示操作 选择一个数字或应用过滤器&#xff08;格式&#xff1a;[groupId&#xff1a;]artifactId&#xff0c;区分大小写包含&#xff09;&a…

阿里云服务器全方位介绍_优势_使用_租用费用详解

阿里云服务器全方位介绍包括云服务器ECS优势、云服务器租用价格、云服务器使用场景及限制说明&#xff0c;阿里云服务器网分享云服务器ECS介绍、个人和企业免费试用、云服务器活动、云服务器ECS规格、优势、功能及应用场景详细你说明&#xff1a; 目录 什么是云服务器ECS&…

C++基础知识 (命名空间、输入输出、函数的缺省参数、函数重载)

⭐️ 第一个 c 代码 &#x1f320; 例1&#xff1a; #include <iostream> using namespace std;int main() {cout << "hello world" << endl;return 0; }#include <iostream> 标准输入输出std 是 c 标准库的命名空间&#xff0c;将标准库的…

Open3D-ML自动驾驶点云目标检测与分割入门

当开始新的研究时&#xff0c;我的方法通常是测试不同的相关事物&#xff0c;直到有足够的经验让我开始将这些点联系起来。 在开始构建用于 3D 对象检测的自定义模型之前&#xff0c;我购买了一台 LiDAR 并处理了一些数据。 下一个明显的步骤是在我为自己的数据贴标签之前找出研…

6、Nginx实现反向代理

Nginx 反向代理是一种常见的应用场景&#xff0c;它允许 Nginx 作为中间服务器接收客户端的请求&#xff0c;并代理转发这些请求到后端的真实服务器。这种配置使得客户端只需要与 Nginx 交互&#xff0c;而后端服务器对客户端是透明的。 ngx_http_proxy_module&#xff1a; 将客…

无涯教程-jQuery - Pulsate方法函数

Pulsate 效果可以与effect()方法一起使用。这会使元素的不透明性产生多次脉冲。 Pulsate - 语法 selector.effect( "pulsate", {arguments}, speed ); 这是所有参数的描述- times - 脉动的时间。默认值为3。model - 效果的模式。可以是"显示(show)"&a…

2023年的深度学习入门指南(22) - 百川大模型13B的运行及量化

2023年的深度学习入门指南(22) - 百川大模型13B的运行及量化 不知道上一讲的大段代码大家看晕了没有。但是如果你仔细看了会发现&#xff0c;其实代码还是不全的。比如分词器我们就没讲。 另外&#xff0c;13B比7B的改进点也没有讲。 再有&#xff0c;对于13B需要多少显存我们…

C++ Insights: 源码工具

godbolt&#xff1a;编译器资源管理器 godbolt是一个交互式工具&#xff0c;允许您在一个窗口中键入代码&#xff0c;并在另一个窗口中查看其编译结果。https://godbolt.org/https://github.com/compiler-explorer/compiler-explorer/wiki C Insights - See your source cod…

IDEA debug总结

调试一次编程题&#xff0c;发现没有掌握debug技巧&#xff0c;确实费事&#xff0c;做一次总结&#xff0c;方便以后回顾。 Run to Cursor 跳到光标处&#xff0c;适用于快速跳过循环&#xff0c;定位到光标处&#xff0c;而不用到处打断点&#xff0c;使用断点跳转。非常实…

基于注解的 SpringMVC

SpringMVC SpringMVC使用SpringMVC的两个配置EnableWebMVC 和 ACWACSpringMVC执行流程接收请求参数Postman 发包工具&#xff08;&#xff09;get 请求---简单类型数据&#xff08;基本数据类型和String&#xff09;get 请求---对象类型数据get 请求---数组类型get 请求 --- 集…

Android 面试题 内存泄露的原因 二

&#x1f525; 什么是内存泄漏 &#x1f525; 在Android开发过程中&#xff0c;当一个对象已经不需要再使用了&#xff0c;本该被回收时&#xff0c;而另个正在使用的对象持有它引用从而导致它不能被回收&#xff0c;这就导致本该被回收的对象不能被回收而停留在堆内存中&#…

关于提示词 Prompt

Prompt原则 原则1 提供清晰明确的指示 注意在提示词中添加正确的分割符号 prompt """ 请给出下面文本的摘要&#xff1a; <你的文本> """可以指定输出格式&#xff0c;如&#xff1a;Json、HTML提示词中可以提供少量实例&#xff0c;…