Mybatis中使用PageHelper出现:除非另外还指定了 TOP、OFFSET 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。

5 篇文章 0 订阅
1 篇文章 0 订阅

在使用PageHelper插件时,如果执行的sql语句中包含了order by 这个关键字,执行这句sql的时候肯定会报错:

除非另外还指定了 TOP、OFFSET 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效。

这是因为order by以后返回的结果时游标,PageHelper 在执行count查询的时候就会报错。针对于这个问题PageHelper官方给出了以下的解决方法:

增加 countSuffix count 查询后缀配置参数,该参数是针对 PageInterceptor 配置的,默认值为 _COUNT。

分页插件会优先通过当前查询的 msId + countSuffix 查找手写的分页查询。

如果存在就使用手写的 count 查询,如果不存在,仍然使用之前的方式自动创建 count 查询。

例如,如果存在下面两个查询:

<select id="selectLeftjoin" resultType="com.github.pagehelper.model.Country">
    select a.id,b.countryname,a.countrycode from country a
    left join country b on a.id = b.id
    order by a.id
</select>
<select id="selectLeftjoin_COUNT" resultType="Long">
    select count(distinct a.id) from country a
    left join country b on a.id = b.id
</select>
上面的 countSuffix 使用的默认值 _COUNT,分页插件会自动获取到 selectLeftjoin_COUNT 查询,这个查询需要自己保证结果数正确。

返回值的类型必须是resultType="Long",入参使用的和 selectLeftjoin 查询相同的参数,所以在 SQL 中要按照 selectLeftjoin 的入参来使用。

因为 selectLeftjoin_COUNT 方法是自动调用的,所以不需要在接口提供相应的方法,如果需要单独调用,也可以提供。

上面方法执行输出的部分日志如下:

DEBUG [main] - ==>  Preparing: select count(distinct a.id) from country a left join country b on a.id = b.id 
DEBUG [main] - ==> Parameters: 
TRACE [main] - <==    Columns: C1
TRACE [main] - <==        Row: 183
DEBUG [main] - <==      Total: 1
DEBUG [main] - Cache Hit Ratio [com.github.pagehelper.mapper.CountryMapper]: 0.0
DEBUG [main] - ==>  Preparing: select a.id,b.countryname,a.countrycode from country a left join country b on a.id = b.id order by a.id LIMIT 10 
DEBUG [main] - ==> Parameters: 
TRACE [main] - <==    Columns: ID, COUNTRYNAME, COUNTRYCODE
TRACE [main] - <==        Row: 1, Angola, AO
TRACE [main] - <==        Row: 2, Afghanistan, AF
TRACE [main] - <==        Row: 3, Albania, AL

 

 

自定义count语句,不在使用PageHelper的默认生成的count语句,在mybait项目中可以用如下方法解决:


<select id ="test" resultType="User">
select * from t_user order by userId
</select>


<select id ="test_COUNT" resultType="Long">
select count(0) from t_user
</select>

如果id=test的这个语句报错,新增一个id=test_COUNT的查询,入参和test一样,但是返回值必须是Long,新增的这个查询不需要声明Mapper接口,PageHelper会自动执行。

 

参考https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/Changelog.md#504---2017-08-01

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
使用PageHelper实现分页非常简单,只需要按照以下步骤: 1. 首先,需要在项目引入PageHelper依赖,例如在Maven项目,在pom.xml加入以下依赖: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.11</version> </dependency> ``` 2. 在查询方法使用PageHelper.startPage()方法来设置分页参数,例如: ```java // pageNum示当前页码,pageSize示每页显示的记录数 PageHelper.startPage(pageNum, pageSize); List<SomeEntity> list = someMapper.selectByExample(example); ``` 3. 将查询结果封装到PageInfo对象,例如: ```java PageInfo<SomeEntity> pageInfo = new PageInfo<>(list); ``` 4. 在页面使用分页标签来展示分页信息,例如: ```html <nav> <ul class="pagination"> <li class="page-item"><a class="page-link" href="?pageNum=1">首页</a></li> <li class="page-item"><a class="page-link" href="?pageNum=${pageInfo.prePage}">上一页</a></li> <li class="page-item"><a class="page-link" href="?pageNum=${pageInfo.nextPage}">下一页</a></li> <li class="page-item"><a class="page-link" href="?pageNum=${pageInfo.pages}">尾页</a></li> </ul> </nav> ``` 其pageNum示当前页码,${pageInfo.prePage}示上一页的页码,${pageInfo.nextPage}示下一页的页码,${pageInfo.pages}示总页数。 以上就是使用PageHelper实现分页的基本步骤。需要注意的是,在使用PageHelper时,需要遵循MyBatis的查询规范,例如使用Example来进行查询,否则无法生效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT管道工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值