mybatis时间条件正确查询不到数据

探讨了一次项目中遇到的奇怪现象:前端传递的时间条件正确无误,但在MyBatis中却查询不到对应的数据。通过对日志和SQL语句的深入分析,最终定位到问题的根源在于代码换行格式导致的查询失败。

mybatis时间条件正确,查询不到数据

背景

最近一次项目中出现一个奇怪的现象,前端传的时间正确,日志打印也是正确的,但就是插叙不到数据;
日志语句和参数,拿到库中执行也能查询到数据;

问题原因

mysql函数格式化问题 date_format 函数格式化问题

问题重现

本地调试拿出sql日志
日志
mysql执行
执行结果

问题解决

通过上面的调试和库里数据的比对,说明数据是有的,但是为什么程序查不出来,mysql能查下出来呢?既然问题想不出来,面向百度编程吗,来度一波。

部分结果如下:
	问题1:数据类型问题,无法比较
	问题2:if条件不生效
	等等......

经过一波度后,发现查询不生效碰到的人还挺多,不过好像解决不了我这个。我遇到的问题前人基本都遇到过,更何况这算是个基础问题呢,如果网上找不到答案,那有可能是用法不对,所以再回过头检查下,当检查到mapper文件时候,看见换行的格式问题截图
突然灵光一现,是不是这个换行问题呢,于是把换行改改,下图是改过后的
修改后的截图
然后重启项目
结果截图
结果为1 查询到数据了。
于是问题最终找到了,只是一个换行的问题。

说明

为什么会换行呢,原项目中的换行是 idea 设置了格式,idea老用户都知道,idea界面中间会有一条竖,当一行太长代码超过这条线后格式化的时候会换行,原项目正巧是这种情况。我这个是演示项目,为了演示效果手动换行的。
<think>嗯,用户遇到了MyBatis-Plus的selectPage查询数据的问题,但直接执行SQL却能查到数据。我需要先回忆一下可能的原因。首先,根据引用[4],分页插件没有正确配置会导致total为0。用户可能没配置PaginationInterceptor,或者配置有误,比如方言设置不正确。然后是逻辑删除的问题,引用[3]提到逻辑删除字段可能被自动过滤了,如果用户的数据被标记为已删除,而查询时没有排除逻辑删除条件,可能查不到数据。这时候需要检查实体类的逻辑删除注解是否正确,或者在查询时手动排除条件。 另外,SQL语句是否有问题?比如自定义的XML文件中分页参数是否正确传递,或者是否有其他拦截器干扰了分页功能。还要看看是否手动添加了limit导致冲突,或者返回类型是否正确,比如是否误用了Page对象而不是具体的实体类型。此外,MyBatis-Plus版本兼容性也是一个可能因素,旧版本可能存在分页bug,需要升级到稳定版本。最后,日志输出是否显示了正确的分页SQL,可以开启日志检查生成的SQL是否符合预期。总结下来,需要逐步排查分页配置、逻辑删除、SQL语句、版本兼容性等方面,用户可以根据这些步骤检查自己的代码配置。</think>### MyBatis-Plus `selectPage` 查询数据的原因及解决方案 #### 一、分页插件未正确配置 **原因**: MyBatis-Plus 的分页功能依赖于分页插件 `PaginationInterceptor`。若未配置或配置错误(如未指定数据库方言),会导致分页查询生成的 SQL 语句异常,返回空数据或 `total=0`[^4]。 **解决方案**: 1. 在 Spring Boot 配置类中添加分页插件: ```java @Configuration public class MybatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor page = new PaginationInterceptor(); page.setDialectType("mysql"); // 根据实际数据库类型设置 return page; } } ``` 2. 检查依赖版本是否兼容(如 MyBatis-Plus ≥3.4.0 需使用 `MybatisPlusInterceptor`)。 --- #### 二、逻辑删除干扰查询 **原因**: 若实体类中配置了逻辑删除字段(如 `@TableLogic`),MyBatis-Plus 会自动过滤已标记为“删除”的数据,导致查询结果为空[^3]。 **解决方案**: 1. **临时忽略逻辑删除**: 手动添加查询条件覆盖全局逻辑删除配置: ```java QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("is_deleted", 0); // 显式添加未删除条件 userMapper.selectPage(page, wrapper); ``` 2. **关闭逻辑删除**(不推荐): 修改实体类注解或全局配置,但可能影响其他业务逻辑。 --- #### 三、自定义 SQL 未适配分页 **原因**: 若使用 XML 自定义 SQL 且未添加分页参数,或未使用 `Page` 对象接收结果,会导致分页失效。 **解决方案**: 1. XML 中正确使用分页参数: ```xml <select id="selectCustomPage" resultType="User"> SELECT * FROM user WHERE age > #{param1.age} LIMIT #{param2.current}, #{param2.size} </select> ``` 2. 确保返回类型为 `IPage<T>`: ```java IPage<User> page = new Page<>(1, 10); userMapper.selectCustomPage(page, 18); ``` --- #### 四、其他常见问题 1. **手动添加 `LIMIT` 导致冲突**: 自定义 SQL 中避免同时使用 `LIMIT` 和分页插件,否则会生成重复的 `LIMIT` 子句。 2. **返回类型错误**: 确保方法返回类型为 `IPage<T>`,而非 `List<T>`。 3. **日志排查**: 开启 SQL 日志,检查实际执行的 SQL 是否包含分页参数: ```properties mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl ``` --- #### 五、版本兼容性问题 **原因**: 旧版本 MyBatis-Plus 可能存在分页功能缺陷(如 `total` 统计错误)。 **解决方案**: 升级到最新稳定版本(如 ≥3.5.3),并检查更新日志中是否修复了相关问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值