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

news2024/11/15 22:58:07

一个解决三天的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天了也没弄明白,愁人

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

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

相关文章

151 shell编程,正则表达式,在C语言中如何使用正则表达式

零&#xff0c;坑点记录&#xff1a;bash 和 dash 的区别&#xff0c;导致的坑点 查看当前用的shell 是啥&#xff0c;用的是/bin/bash hunandedehunandede-virtual-machine:~$ echo $SHELL /bin/bash 当shell 脚本运行的时候&#xff08;后面会学到方法&#xff0c;这里是最…

深入理解React的setState机制

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【Python函数和类1/6】初始函数

目录 目标 导入 函数 内置函数 len()函数 type()函数 自定义函数 定义函数 函数定义规则 调用函数 小结 多次调用 函数的使用原则 总结 目标 从今天开始&#xff0c;我们将通过6篇博文&#xff0c;来一起学习一下函数的相关知识。今天&#xff0c;我们主要从函数概…

Matlab|计及电池储能寿命损耗的微电网经济调度

目录 1 主要内容 储能寿命模型 负荷需求响应 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《考虑寿命损耗的微网电池储能容量优化配置》模型&#xff0c;以购售电成本、燃料成本和储能寿命损耗成本三者之和为目标函数&#xff0c;创新考虑储能寿命损耗约…

一键换脸的facefusion

FaceFusion 一个开源换脸软件&#xff0c;提供UI界面&#xff0c;启动后可直接在浏览器上面上传图片进行换脸操作。 电脑环境win10&#xff0c;软件pycharm&#xff0c;需要提前安装好python环境&#xff0c;推荐使用Anaconda3。关注文章下方公共号发送 “ 软件安装包 ”可以获…

【Java跳槽面试必备】2024年最新八股文

Java基础面试题 Java的特点 Java 与 C 的区别 JDK/JRE/JVM三者的关系 Java程序是编译执行还是解释执行&#xff1f; 面向对象和面向过程的区别&#xff1f; 面向对象有哪些特性&#xff1f; 数组到底是不是对象&#xff1f; Java的基本数据类型有哪些&#xff1f; 为什么不能用…

C. Grouping Increases

Here 解题思路 两个序列&#xff0c;保持顺序对于代价的产生进行考虑当添入一个大于当前序列最后值的数&#xff0c;代价加1&#xff0c;但下次判断标准变大当添入一个小于当前序列最后值的数&#xff0c;代价不增&#xff0c;但下次判断标准变小考虑形象化描述将两个序列看作…

Qt 文件操作

文件概述 文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库&#xff0c;提供了跨平台的文件操作能力。Qt 提供了很多关于文件的类&#xff0c;通过这些类能够对文件系统进行操作&#xff0c;如文件读写、文件信息获取、文件复制或重命名等。 输入输出设备类 在 Qt …

iOS_convert point or rect 坐标和布局转换+判断

文章目录 1. 坐标转换2. 布局转换3. 包含、相交 如&#xff1a;有3个色块 let view1 UIView(frame: CGRect(x: 100.0, y: 100.0, width: 300.0, height: 300.0)) view1.backgroundColor UIColor.cyan self.view.addSubview(view1)let view2 UIView(frame: CGRect(x: 50.0, …

什么是V R美术馆|V R互动体验店加盟|虚拟现实元宇宙

VR美术馆是利用虚拟现实&#xff08;VR&#xff09;技术构建的数字化美术馆&#xff0c;通过虚拟展厅和虚拟展览等形式展示艺术作品、举办艺术展览&#xff0c;为用户提供一种沉浸式的艺术体验。用户可以通过穿戴VR头显等设备&#xff0c;在虚拟环境中自由浏览各种艺术作品&…

Python环境下一种新的类谱峭度算法的旋转机械故障诊断模型

谱峭度SK的本质是计算每根谱线峭度值的高阶统计量&#xff0c;谱峭度对信号中的瞬态冲击成分十分敏感&#xff0c;能有效的从含有背景噪声信号中识别瞬态冲击及其在频带中的分布。由于谱峭度的复杂性、缺少一个正式的定义和一个容易理解的计算过程使其在很长时间内都未能引入到…

Vue3进阶(叁):关于 Vue2 项目迁移至 Vue3 的几点注意事项

文章目录 一、前言二、Vue3 新特性三、Vue2 安全保障四、迁移方案4.1 迁移辅助工具 vue/compat 库 五、迁移注意事项5.1 升级和兼容性5.2 组件的改变5.3 Composition API5.4 Vue Router5.5 Vuex5.6 其他库和插件5.7 差异示例5.7.1 创建vue5.7.2 定义时间格式全局过滤器5.7.3 vu…

修复ubuntu引导

一、制作ubuntu启动U盘 进入启动盘后&#xff0c;点击Try ubuntu&#xff0c;进入U盘的ubuntu系统。 二、配置和添加源 sudo add-apt-repository ppa:yannubuntu/boot-repair && sudo apt-get update三、运行 Boot Repair重新制作引导 sudo boot-repair注意&#x…

QT 控件有突出感,定义控件边框

QT 控件有突出感&#xff0c;定义控件边框 1.设计师页面 在flat部分选中 这个时候按钮会失去边框如下图&#xff1a; 然后在.cpp文件中写入代码&#xff1a; ui->pushButton->setStyleSheet("border: 1px solid gray;");按钮就有了新的边框&#xff1a;

hdlbits系列verilog解答(Hadd)-65

文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 本节我们创建一个半加法器。半加法器将两个位相加(无进位)并产生求和和进出。 模块声明 module top_module( input a, b, output cout, sum ); 思路: 可用真值表写出逻辑表达式,或者直接用数据流方式。 二…

VMware和Xshell连接

1.开启虚拟机 2.使用管理员账户&#xff0c;点击未列出 3.输入用户名密码 4.点击编辑虚拟网络编辑器 5.记住自己的网关和IP地址 6.打开终端 7.输入命令&#xff0c;vim / etc / sysconfig / network -scripts / ifcfg-ens33 回车 8.修改图中两处按“ I ”键进入编辑 d…

【网安小白成长之路】2.PHP与MySQL交互

&#x1f42e;博主syst1m 带你 acquire knowledge&#xff01; ✨博客首页——syst1m的博客&#x1f498; &#x1f51e; 《网安小白成长之路(我要变成大佬&#x1f60e;&#xff01;&#xff01;)》真实小白学习历程&#xff0c;手把手带你一起从入门到入狱&#x1f6ad; &…

Jenkins--在Linux上使用Docker安装

一、Jenkins 简介 Jenkins是一个流行的开源自动化服务器&#xff0c;用于持续集成和持续交付&#xff08;CI/CD&#xff09;。Jenkins的核心功能主要包括以下几点&#xff1a; 持续集成&#xff1a;Jenkins可以监控版本控制系统&#xff08;如Git、SVN&#xff09;中的代码变…

Django开发复盘

一、URL 对于一个不会写正则表达式的蒟蒻来说&#xff0c;在urls.py中就只能傻傻的写死名字&#xff0c;但是即便这样&#xff0c;还会有很多相对路径和绝对路径的问题&#xff08;相对ip端口的路径&#xff09;&#xff0c;因为我们网页中涉及到页面跳转&#xff0c;涉及到发送…

【LaTeX】7实现章节跳转

使用 LaTeX 实现章节跳转 写在最前面1. 引入 hyperref 包2. 标记章节3. 引用章节示例代码注意 小技巧总结 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴与支持 ~ &#x1f680; 欢迎一起踏上探险之旅&#xff0c;…