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


前言

在这篇文章,我们保存了数据库的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()反序列化输出,可以看到顺序不会被打乱,和数据库的一致。

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

猜你喜欢

转载自blog.csdn.net/xiaohuihui1400/article/details/131997530