Skip to content

pageHelper使用分页时查询总条数sql错误 #868

@pwdLight

Description

@pwdLight

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>

日志截图如下:

Image

报错原因: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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions