文章目录
- 前言
- 数据库
- 问题背景
- 后端返回实体对象
- 前端
- 实现
- 后端返回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()反序列化输出,可以看到顺序不会被打乱,和数据库的一致。
那么我们就可以直接拿到这一串数据和数据库进行模糊查询匹配。