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

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

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

controller:

	@Autowired
	private IDeviceRandomRecordService deviceRandomRecordService;
	@Autowired
	private 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的key
		List<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">
        SELECT
        DeviceRandomRecord.*, device.device_name as deviceName
        from device_random_record as DeviceRandomRecord left join device on DeviceRandomRecord.device_id=device.device_code
        where 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代码如下:

@Autowired
	private IDeviceRandomRecordService deviceRandomRecordService;
	@Autowired
	private 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的key
		List<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天了也没弄明白,愁人

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql数据库表字段使用desc等关键字报错及解决方法

建议尽量避开关键字&#xff01;&#xff01;&#xff01; 如果实在必须用&#xff0c;那参考下面解决办法&#xff1a; 在要用到关键字的地方加反引号标识&#xff1a;

@EnableWebMvc 导致自定义序列化器失效

目录 前言 一. 自定义序列化器失效 1.1 EnableWebMvc 的作用 1.2 EnableWebMvc 带来了什么后果 1.3 原理分析 1.4 问题解决 二. 总结 前言 在使用Swagger的时候用 到了EnableWebMvc&#xff0c;发现之前为了解决Long类型、日期类型等自定义序列化器失效了 Configurati…

JavaScript、ES6与微信小程序:工具箱、升级与新房子

JavaScript、ES6和微信小程序三者之间有什么联系&#xff1f;我想&#xff0c;作为初学者还是有点蒙。下面作一个简单的分析&#xff0c;供大家参考。 首先,我们可以把JavaScript想象成一个非常强大的工具箱,里面装满了各种各样的工具。这些工具可以帮助我们完成各种任务,比如…

vivado 使用远程主机和计算群集

使用远程主机和计算群集 概述 AMD Vivado™集成设计环境&#xff08;IDE&#xff09;支持同时并行合成和实现的执行在多个Linux主机上运行。你可以做到这一点通过配置单个主机或指定要在其上启动作业的命令手动执行现有的计算集群。目前&#xff0c;Linux是Vivado唯一支持远程主…

书生浦语大模型实战营第一课笔记

书生浦语大模型全链路开源体系 课程笔记大模型的发展趋势InternLM2的主要亮点模型到应用的典型流程全链路的开源工具 InternLM2技术报告笔记大型语言模型的发展InternEvoModel Structure训练数据 课程笔记 第一节课主要对大模型进行介绍&#xff0c;特别是书生浦语大模型的发展…

【读书微言】The first summary

系列文章目录 文章目录 系列文章目录前言一、读书微言总结 前言 一、读书微言 强大的内心催生信念我们的生活是否幸福并不是依靠外在的环境&#xff0c;而是依靠我们内在的信念。要想成为自己命运的主宰&#xff0c;我们就必须形成自己的信念。只要我们能坚定自己的内在信念&…

认识线程(Thread)

目录 一、概念 1、 线程是什么 2、为啥要有线程&#xff1f; 3、进程和线程的区别 4、Java 的线程 和 操作系统线程 的关系 二、第⼀个多线程程序 三、创建线程 ⽅法1&#xff1a;继承 Thread 类 ⽅法2&#xff1a;实现 Runnable 接⼝ 对⽐上⾯两种⽅法: 其他变形 四、…

鸿蒙应用开发学习:用Marquee组件做个跑马灯

一、前言 鸿蒙应用的学习持续进行中&#xff0c;这两天阅读官方的API参考文档&#xff0c;发现一个有趣的组件——Marquee&#xff0c;用它做了个跑马灯&#xff0c;做个学习记录。 二、参考资料 官网文档链接如下&#xff1a; https://developer.huawei.com/consumer/cn/d…

【JVM】Java八股文之JVM篇

目录 一、JVM类加载与垃圾回收加载过程加载机制优点图解加载机制 分代回收分代垃圾回收新生代垃圾回收老年代垃圾回收 回收算法 一、JVM类加载与垃圾回收 面试过程中最经典的一题&#xff1a; 请你讲讲在JVM中类的加载过程以及垃圾回收&#xff1f; 加载过程 当Java虚拟机&…

双纤SFP光模块和单纤SFP光模块之间的区别

双纤SFP光模块和单纤SFP光模块是两种不同的光模块类型。对于网络部署而言&#xff0c;了解它们之间的区别至关重要。本文将深入探讨这两种光模块之间的差异&#xff0c;并介绍其特性和适用场景。 双纤与单纤SFP光模块&#xff1a;它们是什么&#xff1f; 双纤SFP光模块是常用…

回文子串 每日温度 接雨水

647. 回文子串 力扣题目链接 如果s【i】和s【j】相同 dp【i1】【j-1】也是回文串的话 &#xff08;等于true&#xff09; 那么dp【i】【j】也是回文串 true 定义一个bool二维数组 遍历顺序是从下到上 从左到右 因为dp【i】【j】是通过dp【i1】【j-1】推出来的 i从最后一…

120.龙芯2k1000-qt(19)-做了一个qt测试界面

主要接口和性能测试&#xff0c;主要针对的是龙芯2k1000. 以下是windows下的截图&#xff0c;大概功能就是这样吧&#xff0c;能想到的都想了一遍。 cpu的温度和频率采集不到&#xff0c;就没有放了。

冒泡排序(六大排序)

冒泡排序 冒泡排序的特性总结&#xff1a; 1. 冒泡排序是一种非常容易理解的排序 2. 时间复杂度&#xff1a;O(N^2) 3. 空间复杂度&#xff1a;O(1) 4. 稳定性&#xff1a;稳定 动图分析&#xff1a; 代码实现&#xff1a; Swap(int*p1,int*p2) {int tmp *p1;*p1*p2…

程序员35岁的职业困惑及应对之道

35岁,对许多程序员来说,是一个职业生涯的重要分水岭。在这个年龄,一些人开始感到迷茫和焦虑,担心自己的技能已经落后,难以跟上日新月异的技术变革。而另一些人则充满信心,认为多年来积累的丰富经验和扎实的技术功底,将助力他们在未来的职业道路上取得新的飞跃。 无疑,在AI、自…

【Flutter 面试题】 Flutter中的路由(Route)是什么?如何在应用程序中实现路由导航?

【Flutter 面试题】 Flutter中的路由&#xff08;Route&#xff09;是什么&#xff1f;如何在应用程序中实现路由导航&#xff1f; 文章目录 写在前面口述回答补充说明 写在前面 &#x1f64b; 关于我 &#xff0c;小雨青年 &#x1f449; CSDN博客专家&#xff0c;GitChat专栏…

电商产品效果图渲染用什么工具更方便?

​在电子商务的快速发展中&#xff0c;产品的视觉呈现变得至关重要。对于电商行业的设计师而言&#xff0c;选择一款既便捷又高效的渲染工具&#xff0c;对于快速完成高质量的产品效果图至关重要。特别是对于初学者&#xff0c;工具的直观性和功能性是他们最为关注的焦点。 那…

在线接口文档预言方案

在线接口文档预言方案 要求&#xff1a; ​ 支持自动生成接口文档 ​ 能够支持在线测试(http&#xff0c;websocket) ​ 对代码没有侵入性 一、目前涉及的相关技术收集 sudo apt update #更新数据 sudo apt upgrade #更新软件 sudo apt install openssh-server #下载安装…

鸿蒙HarmonyOS应用开发之Node-API常见问题

ArkTS/JS侧import xxx from libxxx.so后&#xff0c;使用xxx报错显示undefined/not callable 排查.cpp文件在注册模块时的模块名称与so的名称匹配一致。 如模块名为entry&#xff0c;则so的名字为libentry.so&#xff0c;napi_module中nm_modname字段应为entry&#xff0c;大小…

844. 走迷宫 典bfs

AC代码&#xff1a; #include<algorithm> #include<iostream> #include<cstring> #include<queue> #include<algorithm> #include<cmath> using namespace std; const int N 110;int mp[N][N]; int sx,sy; bool vis[N][N]; struct node{i…

2024年热门游泳耳机推荐!公认最佳的4大游泳耳机分享,好用不贵

随着科技的发展&#xff0c;游泳运动已经不仅仅是一项健身活动&#xff0c;更是一种生活方式。在游泳过程中&#xff0c;音乐的陪伴能够让我们更好地享受这项运动&#xff0c;同时也能提高我们的游泳效果。因此&#xff0c;选择一款适合自己的游泳耳机显得尤为重要。 然而&…