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