mybatis pagehelper count order by 不生效

背景

  • 有一条复杂的SQL语句,涉及子查询内部排序order by。发现mybatis pagehelpercount的时候会把order by删除。
    在这里插入图片描述
  • 从上图来看order by是被过滤掉了。

解决方案

  • 在原sql增加/*keep orderby*/解决。
  • 我们可以在源码上答案,知道为什么这样做?
  • 定位到CountSqlParser#getSmartCountSql方法。
public static final String KEEP_ORDERBY = "/*keep orderby*/";

在这里插入图片描述

  • getSimpleCountSql方法是直接拼接sql。
    在这里插入图片描述

  • 从上面源码可得知,sql内容中如果包含/*keep orderby*/这个字符串那么count的时候就不会修改原内容。

  • 在xml中增加/*keep orderby*/
    在这里插入图片描述

  • 重启再次请求order by生效了,效果如下所示。
    在这里插入图片描述

pagehelper是一个用于分页的插件,如果你的pagehelper不生效,可能是以下原因: 1. 没有正确引入pagehelper依赖 在你的项目中,需要在pom.xml文件中引入pagehelper依赖: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>x.x.x</version> </dependency> ``` 其中,x.x.x是pagehelper的版本号,可以根据实际情况进行修改。 2. 没有正确配置pagehelper插件 在你的MyBatis配置文件中,需要配置pagehelper插件: ```xml <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <property name="helperDialect" value="mysql"/> <property name="reasonable" value="true"/> <property name="supportMethodsArguments" value="true"/> <property name="params" value="count=countSql"/> </plugin> </plugins> ``` 其中,helperDialect需要根据你的数据库类型进行修改;reasonable为true表示当pageNum<=0或pageNum大于pages,会查询第一页或最后一页;supportMethodsArguments为true表示支持通过Mapper接口参数来传递分页参数;params的值为count=countSql表示使用相同的SQL语句进行分页查询和总数查询。 3. 没有正确使用pagehelper分页 在Mapper接口中,需要使用@Param注解来传递分页参数: ```java List<User> getUsers(@Param("pageNum")int pageNum, @Param("pageSize")int pageSize); ``` 在Mapper.xml文件中,需要使用PageHelper.startPage方法来开始分页查询: ```xml <select id="getUsers" resultType="User"> select * from user <if test="pageNum!=null and pageSize!=null"> order by id desc <![CDATA[ limit #{pageNum},#{pageSize} ]]> </if> </select> ``` 其中,<![CDATA[ limit #{pageNum},#{pageSize} ]]>表示分页查询SQL语句。 以上是pagehelper不生效的一些可能原因和解决方法,你可以检查一下是否有这些问题,如果还有问题可以提供更详细的信息,我会尽力帮助你解决。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值