PageHelper分页查询

本文详细介绍了PageHelper在Spring Boot项目中进行分页查询时的使用方法,包括正确放置分页代码的位置,以及如何解决在多表查询中遇到的数据总量计算错误。针对复杂SQL查询导致的PageHelper异常,提出了通过调整SQL结构,使用JOIN而非子查询来避免问题。同时,文章还提到了在处理查询结果集后保持分页信息完整性的两种策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PageHelper使用:
1、这个一定要放查询语句的前一行,否则无法进行分页,因为它对紧随其后第一个sql语句有效,因此若有多次查询需要,则需放在获取最终结果集查询之前

PageHelper.startPage(userQueryModel.getPage(), userQueryModel.getRows());
List<TlSysUserExp> userList = tlSysUserExtMapper.selectUser(userQueryModel);

2、涉及多表查询,获取数据总量失败

PageHelper.startPage(messageQueryModel.getPage(), messageQueryModel.getRows());
List<Map> resList = tlCommMessageExtMapper.getConRateListBySql(messageQueryModel.getAppkey(), appIdLists);
    <select id="getConRateListBySql" resultType="java.util.Map">
        SELECT
        DISPLAY_TEXT,
        MONUM,
        MTNUM,
        IF
        (
        MTNUM > MONUM,
        '100.0%',
        CONCAT( ROUND( MTNUM / MONUM * 100, 1 ), '%' )) CONRATE
        FROM
        (
        (
        SELECT
        DISPLAY_TEXT,
        COUNT( 0 ) MONUM
        FROM
        (
        SELECT
        T1.DISPLAY_TEXT,
        T2.APP_KEY
        FROM
        ( SELECT DISPLAY_TEXT FROM TL_COMM_DELIVER WHERE DISPLAY_TEXT IS NOT NULL
        <if test="appIds != null and appIds.size() > 0">
            AND APP_ID IN
            <foreach collection="appIds" item="appId" index="index" open="(" close=")" separator=",">
                #{appId}
            </foreach>
        </if>
        GROUP BY DISPLAY_TEXT) T1,
        TL_COMM_MESSAGE T2
        WHERE
        T2.MSG_CONTENT LIKE CONCAT( '%displayText":"', T1.DISPLAY_TEXT, '%' ) AND T2.APP_KEY = #{appkey}
        ) AS T3
        GROUP BY
        T3.DISPLAY_TEXT
        ) AS MODB ,
        ( SELECT DISPLAY_TEXT DISPLAY_TEXT1, COUNT( 0 ) MTNUM FROM TL_COMM_DELIVER WHERE DISPLAY_TEXT IS NOT
        NULL
        <if test="appIds != null and appIds.size() > 0">
            AND APP_ID IN
            <foreach collection="appIds" item="appId" index="index" open="(" close=")" separator=",">
                #{appId}
            </foreach>
        </if>
        GROUP BY DISPLAY_TEXT ) AS MTDB
        )
        WHERE
        MODB.DISPLAY_TEXT = MTDB.DISPLAY_TEXT1

由于PageHelper获取数据总量是将sql重新拼接,因此涉及类似于这种多表查询较复杂sql时,会出现拼接后sql无法执行,导致异常问题,所有需要改变该sql结构,首先需整体查询一遍,其次需将sql连接符 ,改为join,改变后sql如下:

<select id="getConRateListBySql" resultType="java.util.Map">
 SELECT * FROM (SELECT
        DISPLAY_TEXT,
        MONUM,
        MTNUM,
        IF
        (
        MTNUM > MONUM,
        '100.0%',
        CONCAT( ROUND( MTNUM / MONUM * 100, 1 ), '%' )) CONRATE
        FROM
        (
        (
        SELECT
        DISPLAY_TEXT,
        COUNT( 0 ) MONUM
        FROM
        (
        SELECT
        T1.DISPLAY_TEXT,
        T2.APP_KEY
        FROM
        ( SELECT DISPLAY_TEXT FROM TL_COMM_DELIVER WHERE DISPLAY_TEXT IS NOT NULL
        <if test="appIds != null and appIds.size() > 0">
            AND APP_ID IN
            <foreach collection="appIds" item="appId" index="index" open="(" close=")" separator=",">
                #{appId}
            </foreach>
        </if>
        GROUP BY DISPLAY_TEXT) T1,
        TL_COMM_MESSAGE T2
        WHERE
        T2.MSG_CONTENT LIKE CONCAT( '%displayText":"', T1.DISPLAY_TEXT, '%' ) AND T2.APP_KEY = #{appkey}
        ) AS T3
        GROUP BY
        T3.DISPLAY_TEXT
        ) AS MODB JOIN
        ( SELECT DISPLAY_TEXT DISPLAY_TEXT1, COUNT( 0 ) MTNUM FROM TL_COMM_DELIVER WHERE DISPLAY_TEXT IS NOT
        NULL
        <if test="appIds != null and appIds.size() > 0">
            AND APP_ID IN
            <foreach collection="appIds" item="appId" index="index" open="(" close=")" separator=",">
                #{appId}
            </foreach>
        </if>
        GROUP BY DISPLAY_TEXT ) AS MTDB
        )
        WHERE
        MODB.DISPLAY_TEXT = MTDB.DISPLAY_TEXT1) RESDB
</select>

3、获得查询结果集后若又对查询结果集进行操作,从而改变了结果集长度,则获取到的数据总量与当前结果集长度一致,此时有2中解决方式:
(1):重新查询结果集数据总量,赋给PageHelper
(2):在操作结果集之前保留PageHelper获取到的数据总量,操作完结果集之后再重新赋给PageHelper

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值