【搞不明白】redis和mysql、mybatisplus有啥关系

一个解决三天的bug,到现在也没有搞明白,如题,到底redis和mysql、mybatisplus能有啥关系。三个不相关的嘛

记录下问题: (框架用的Jeecgboot 3.6.0) – 学习使用
看下面的一段代码,是一个分页查询:注意引用的redisTemplate对象,它定义成立RedisTemplate ,没加任何泛型

controller:

	@Autowiredprivate IDeviceRandomRecordService deviceRandomRecordService;@Autowiredprivate RedisTemplate redisTemplate;/*** 分页列表查询** @param deviceRandomRecord* @param pageNo* @param pageSize* @param req* @return*/@ApiOperation(value="设备随机数生成记录表-分页列表查询", notes="设备随机数生成记录表-分页列表查询")@GetMapping(value = "/list")public Result<IPage<DeviceRandomRecord>> queryPageList(DeviceRandomRecord deviceRandomRecord,@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,HttpServletRequest req) {Set<String> keys = redisTemplate.keys(DeviceCommonConstant.DEVICE_RANDOM_CODE + "*");// 查询所有在线设备id的keyList<String> codes = redisTemplate.opsForValue().multiGet(keys);// 查询所有在线设备的shakeCode// .... 此处省略不必要的判断操作Page<DeviceRandomRecord> page = new Page<DeviceRandomRecord>(pageNo, pageSize);IPage<DeviceRandomRecord> pageList = deviceRandomRecordService.pageDeviceRandomRecord(page, deviceRandomRecord);List<DeviceRandomRecord> list = pageList.getRecords();if (ObjectUtils.isNotEmpty(list)) {if (deviceRandomRecord.getIsOnline()) {for (DeviceRandomRecord randomRecord : list) {randomRecord.setIsOnline(true);// 在线}} else {for (DeviceRandomRecord randomRecord : list) {randomRecord.setIsOnline(false);// 离线}}}return Result.OK(pageList);}

上述代码中,首先通过redis查询在线的设备的shakeCode列表,有了codes 信息后在通过mybatisplus插件去查询mysql数据库。我把mapper的xml文件也贴出来,如下:

    <resultMap id="DeviceRandomRecordMap" type="org.jeecg.modules.device.entity.DeviceRandomRecord"><result column="id" property="id" jdbcType="VARCHAR"/><result column="create_by" property="createBy" jdbcType="VARCHAR"/><!-- .... 省略字段 --> </resultMap><select id="pageDeviceRandomRecord" resultMap="DeviceRandomRecordMap">SELECTDeviceRandomRecord.*, device.device_name as deviceNamefrom device_random_record as DeviceRandomRecord left join device on DeviceRandomRecord.device_id=device.device_codewhere 1=1<if test="query.deviceName!=null and query.deviceName!=''">and device.device_name like CONCAT('%', #{query.deviceName}, '%')</if><if test="query.isOnline!=null and query.isOnline==true">and DeviceRandomRecord.shake_code in<foreach item="code" collection="query.onlineCodes" open="(" separator="," close=")">#{code}</foreach></if><if test="query.isOnline!=null and query.isOnline==false">and DeviceRandomRecord.shake_code not in<foreach item="code" collection="query.offlineCodes" open="(" separator="," close=")">#{code}</foreach></if><!-- .... 省略其他查询条件的构建 --> order by DeviceRandomRecord.create_time desc,DeviceRandomRecord.id</select>

上面的过程看似标准的分页查询,正常可以得到结果:
正常获取分页查询结果
好嘛,为了代码显得格式规范,我把代码格式化,将漏掉的泛型添加上去后,controller代码如下:

@Autowiredprivate IDeviceRandomRecordService deviceRandomRecordService;@Autowiredprivate RedisTemplate<String, String> redisTemplate;/*** 分页列表查询** @param deviceRandomRecord* @param pageNo* @param pageSize* @param req* @return*/@ApiOperation(value="设备随机数生成记录表-分页列表查询", notes="设备随机数生成记录表-分页列表查询")@GetMapping(value = "/list")public Result<IPage<DeviceRandomRecord>> queryPageList(DeviceRandomRecord deviceRandomRecord,@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,HttpServletRequest req) {Set<String> keys = redisTemplate.keys(DeviceCommonConstant.DEVICE_RANDOM_CODE + "*");// 查询所有在线设备id的keyList<String> codes = redisTemplate.opsForValue().multiGet(keys);// 查询所有在线设备的shakeCode// .... 此处省略不必要的判断操作Page<DeviceRandomRecord> page = new Page<DeviceRandomRecord>(pageNo, pageSize);IPage<DeviceRandomRecord> pageList = deviceRandomRecordService.pageDeviceRandomRecord(page, deviceRandomRecord);List<DeviceRandomRecord> list = pageList.getRecords();if (ObjectUtils.isNotEmpty(list)) {if (deviceRandomRecord.getIsOnline()) {for (DeviceRandomRecord randomRecord : list) {randomRecord.setIsOnline(true);// 在线}} else {for (DeviceRandomRecord randomRecord : list) {randomRecord.setIsOnline(false);// 离线}}}return Result.OK(pageList);}

注意,只改动了这里

@Autowired
private RedisTemplate<String, String> redisTemplate;

将RedisTemplate添加了泛型,因为查询分页的方法里面所有的操作都是对字符串的,当然也尝试过

@Autowired
private StringRedisTemplate redisTemplate;

问题,就出现了,同样的条件,数据就查询不出来了:
同样条件查不出数据了
简直离谱,毫无道理可言!
这个bug跟踪了三天没有理出个头绪来,redis、mysql、mybatisplus能有什么关系?框架中的东西就是简单的查询操作,redis中获取的数据只是一个查询的条件变量,简直离谱!!!

去掉泛型后,就有结果,加上后,mybatisplus只能打印出 count语句,并且count是有结果的,就是不执行select查询数据操作:

2024-03-27 22:13:17.362 [http-nio-8080-exec-2] [39mDEBUG[0;39m [36mo.j.m.d.m.D.pageDeviceRandomRecord_mpCount:137[0;39m - ==>  Preparing: SELECT COUNT(*) AS total FROM device_random_record AS DeviceRandomRecord WHERE 1 = 1 AND DeviceRandomRecord.shake_code IN (?, ?)
2024-03-27 22:13:17.363 [http-nio-8080-exec-2] [39mDEBUG[0;39m [36mo.j.m.d.m.D.pageDeviceRandomRecord_mpCount:137[0;39m - ==> Parameters: "318812"(String), "320221"(String)
2024-03-27 22:13:17.366 [http-nio-8080-exec-2] [39mDEBUG[0;39m [36mo.j.m.d.m.D.pageDeviceRandomRecord_mpCount:137[0;39m - <==      Total: 1

实际上mysql数据库中的数据都嘎嘎存在:

2024-03-27 22:22:59.451 [http-nio-8080-exec-1] [39mDEBUG[0;39m [36mo.j.m.d.m.D.pageDeviceRandomRecord_mpCount:137[0;39m - ==>  Preparing: SELECT COUNT(*) AS total FROM device_random_record AS DeviceRandomRecord WHERE 1 = 1 AND DeviceRandomRecord.shake_code IN (?, ?)
2024-03-27 22:22:59.515 [http-nio-8080-exec-1] [39mDEBUG[0;39m [36mo.j.m.d.m.D.pageDeviceRandomRecord_mpCount:137[0;39m - ==> Parameters: 318812(String), 320221(String)
2024-03-27 22:22:59.530 [http-nio-8080-exec-1] [39mDEBUG[0;39m [36mo.j.m.d.m.D.pageDeviceRandomRecord_mpCount:137[0;39m - <==      Total: 1
2024-03-27 22:22:59.536 [http-nio-8080-exec-1] [39mDEBUG[0;39m [36mo.j.m.d.m.D.pageDeviceRandomRecord:137[0;39m - ==>  Preparing: SELECT DeviceRandomRecord.id, DeviceRandomRecord.create_by, DeviceRandomRecord.create_time, DeviceRandomRecord.update_by, DeviceRandomRecord.update_time, DeviceRandomRecord.sys_org_code, DeviceRandomRecord.shake_code, DeviceRandomRecord.device_id, DeviceRandomRecord.port, DeviceRandomRecord.dest_port, DeviceRandomRecord.cur_day, DeviceRandomRecord.ip_addr, DeviceRandomRecord.conn_duration, DeviceRandomRecord.offline_time, device.device_name AS deviceName FROM device_random_record AS DeviceRandomRecord LEFT JOIN device ON DeviceRandomRecord.device_id = device.device_code WHERE 1 = 1 AND DeviceRandomRecord.shake_code IN (?, ?) ORDER BY DeviceRandomRecord.create_time DESC, DeviceRandomRecord.id LIMIT ?
2024-03-27 22:22:59.544 [http-nio-8080-exec-1] [39mDEBUG[0;39m [36mo.j.m.d.m.D.pageDeviceRandomRecord:137[0;39m - ==> Parameters: 318812(String), 320221(String), 10(Long)
2024-03-27 22:22:59.551 [http-nio-8080-exec-1] [39mDEBUG[0;39m [36mo.j.m.d.m.D.pageDeviceRandomRecord:137[0;39m - <==      Total: 2

count结果数据2条
到底是啥子原因,为啥RedisTemplate<String, String>泛型能影响数据查询结果,无语~~搞不明白

来个大神解答下吧,一个问题研究3天了也没弄明白,愁人

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/572335.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全国地质灾害点shp崩塌滑坡泥石流空间分布地质灾害详查等数据集

地质灾害是指在自然或者人为因素的作用下形成的&#xff0c;对人类生命财产造成的损失、对环境造成破坏的地质作用或地质现象。地质灾害在时间和空间上的分布变化规律&#xff0c;既受制于自然环境&#xff0c;又与人类活动有关&#xff0c;往往是人类与自然界相互作用的结果。…

大型网络游戏设计与AI赋能-4

接上文---- 第一个要去搭建的就是这个运行平台层。在此之上&#xff0c;我们会引入一些第三方SDK包。 为什么要引入第三方的SDK包&#xff1f;大家要知道一点&#xff0c;任何研发一款软件从来都不会从头造轮子。就是我们在开发一款软件的时候&#xff0c;从来都不会从头造轮子…

yarn按包的时候报错 ../../../package.json: No license field

运行 yarn config list 然后运行 yarn config set strict-ssl false 之后yarn就成功了

Swagger3探索之游龙入海

引言 后端开发中常用的接口调用工具一般使用Postman、ApiPost工具&#xff0c;但后期需要与前端联调&#xff0c;要补充接口文档花费大量时间&#xff0c;此时Swagger3应运而生&#xff0c;大大提高沟通交流的效率。 引用依赖 <!-- Swagger3 调用方式 http://ip:port/swa…

ZYNQ学习之PetaLinux开发环境搭建

基本都是摘抄正点原子的文章&#xff1a;<领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf&#xff0c;因初次学习&#xff0c;仅作学习摘录之用&#xff0c;有不懂之处后续会继续更新~ FTP&#xff1a;File Transfer Protocol 一、Ubuntu 和 Windows 文件互传 1.1、开启 Ubu…

Vue3新手教程

Vue3新手教程 一. Vue3简介1. 性能的提升2.源码的升级3. 拥抱TypeScript4. 新的特性 二. 创建Vue3工程1. 基于 vue-cli 创建2. 基于 vite 创建(推荐)3. 一个简单的效果 三. Vue3核心语法1. OptionsAPI 与 CompositionAPI2. 拉开序幕的 setup2.1 setup 概述2.2 setup 的返回值2.…

STM32的SPI通信介绍

SPI简介 SPI:串行外设接口,与IIC一样都是通用数据总线。四根通信线&#xff1a;SCK&#xff0c;MOSI&#xff08;DO&#xff09;&#xff0c;MISO&#xff08;DI&#xff09;&#xff0c;SS。同步&#xff08;共用一根时钟线&#xff09;&#xff0c;全双工&#xff08;数据发…

已注册的商标别忘了续展,新注可能难下证!

近期普推知产老杨遇到好几个网友和看过多个案例&#xff0c;以前商标名称可以申请注册下来&#xff0c;但是换字体注册不下来了&#xff0c;有的是不想续展想直接换字体申请注册&#xff0c;但是也没有下来。 这些商标名称主要是存在禁止注册或缺显&#xff0c;比如“柳林”以前…

阿基米德和C++

阿基米德和C 今天在看书的时候发现一个有意思的小文章&#xff0c;说蒋介石的英文名字叫真该死&#xff0c;如果翻译回中文的话&#xff0c;变成了常凯生&#xff1b; 由此想到看计算机的书籍&#xff0c;必要时&#xff0c;一定要看看用英文原版&#xff0c;因为这个翻译的水平…

Apriori关联算法

Apriori---[əpriˈɔri] ---先天的&#xff0c;推测的 什么是关联规则&#xff1f; 尿布 -> 葡萄酒 就是一个关联规则。如果顾客买了尿布&#xff0c;那么在统计上&#xff0c;那么他会购买葡萄酒的概率比较大。&#xff08;但是&#xff0c;这一条件反过来并不总是成立。…

Openstack创建和操作实例,实现与外部网络通信

一、熟悉OpenStack图形界面操作 1、了解Horizon项目 Horizon项目 各OpenStack服务的图形界面都是由Horizon提供的。Horizon提供基于Web的模块化用户界面。Horizon为云管理员提供一个整体的视图。Horizon为终端用户提供一个自主服务的门户。Horizon由云管理员进行管理与控制&a…

微分几何:曲线基本理论

参数曲线基本理论 曲线的定义 假设有一个运动的质点&#xff0c;从0到T时刻&#xff0c;质点从A点运动到B点&#xff0c;质点运动的轨迹形成了一条曲线&#xff0c;我们可以将这条路径曲线看成是时间 t ∈ [ 0 , T ] t \in [0,T] t∈[0,T]到空间位置 R R R的映射。 映射的概念…