-
-
Notifications
You must be signed in to change notification settings - Fork 3.1k
Closed
Description
PageHelper 分页排序问题分析
版本信息
| 组件 | 版本 |
|---|---|
| PageHelper | 5.1.8 |
| JSqlParser | 1.2 |
| 数据库 | PostgreSQL 11.1 |
问题描述
在 ORDER BY 子句中使用 CASE WHEN 或者布尔进行条件排序时,生成的查询总条数 SQL 出现语法错误。
问题代码
<select id="selectTest" parameterType="com.jiuaoedu.serviceprofile.pojo.student.StudentDetail" resultMap="BaseResultMap">
select *
from service_profile.student s
-- 按"指定校区优先(0)→其他校区(1)"排序,再按校区ID降序,NULL值后置
order by CASE WHEN s.school_area = #{schoolArea} THEN 0 ELSE 1 END,
s.school_area DESC NULLS LAST
</select>日志截图如下:
报错原因:COUNT(0)聚合查询中包含ORDER BY子句,且school_area未参与GROUP BY,违反 SQL 语法规则。
查看源码发现count的sql生成逻辑为:
ORDER BY子句包含占位符(如#{schoolArea}对应?),PageHelper 会保留ORDER BY,isSimpleCount方法与sqlToCount方法会判断是否为一个简单sql大致逻辑如下:
- 包含GROUP BY子句
-包含DISTINCT关键字
-SELECT列表中包含参数等等
所以就生成了这个错误的sql
我使用布尔排序测试,发现在5.1.8没有问题
<select id="selectTest" parameterType="com.jiuaoedu.serviceprofile.pojo.student.StudentDetail" resultMap="BaseResultMap">
select *
from service_profile.student s
order by s.school_area = #{schoolArea} desc nulls last
</select>debug发现是因为5.1.8中引入的jsqlparser较低,jsqlparser解析不了该sql报错,然后就直接返回了simpleCountSql.
我升级了pageHelper版本至6.6.1再次尝试上诉所有内容:
实验1:跟第一次没升级版本出现的报错一样
实验2:第一次没升级不会报错,正常分页查询。在升级版本之后,却出现了报错,原因是因为pageHelper6.6.1中jsqlparser升级为了4.7能够正常解析实验2的结果,然后就出现了和实验1一样的报错。
详情可看我写的这篇博客:https://blog.csdn.net/qq_45774406/article/details/153690941?spm=1001.2014.3001.5501
abel533
Metadata
Metadata
Assignees
Labels
No labels