记录一个关于PageHelper的坑
下面是部分代码,我在方法中并没有使用PageHelper.startPage()方法开启分页,
但还是进行了分页查询,于是开始找原因,一开始怀疑是其他方法调用了PageHelper.startPage(),
并且PageHelper.startPage()方法的作用域是类,但是PageHelper.startPage()方法的作用域是跟
线程绑定的,并且只对调用startPage()方法之后紧随其后的第一个SQL查询有效,那为什么我并没有
使用PageHelper.startPage()方法开启分页还是进行了分页呢,找不到原因于是开始尝试在此方法内禁掉分页查询
@RequestMapping ( value = "/query_ot_list_count" )
public ResultResponse < PageResp < OtCountVo > > queryOtListCount ( @RequestBody OtCountDto otCountDto) {
LOG . info ( "查加班统计列表:{}" , JSON . toJSONString ( otCountDto) ) ;
ResultResponse < PageResp < OtCountVo > > result= new ResultResponse < PageResp < OtCountVo > > ( ) ;
if ( CoreUtils . isNull ( otCountDto) || CoreUtils . isNull ( otCountDto. getSchoolId ( ) ) ) {
result. setRescode ( RespConsts . PARAM_ERROR ) ;
result. setResmsg ( "学校id不可以为空" ) ;
return result;
}
PageResp < OtCountVo > pageResp = otBusiness. queryOtListCount ( otCountDto) ;
try {
result. setData ( pageResp) ;
result. setRescode ( RespConsts . SUCCESS_RET ) ;
result. setResmsg ( "SUCCESS" ) ;
} catch ( Exception e) {
LOG . error ( e. getMessage ( ) , e) ;
result. setResmsg ( "查询加班统计列表失败" ) ;
result. setRescode ( RespConsts . SERVICE_ERROR ) ;
}
return result;
}
public PageResp < OtCountVo > queryOtListCount ( OtCountDto otCountDto) {
List < OtCountVo > otCountVos = otInfoDao. selectOtsByOtCountDtos ( otCountDto) ;
}
public class OtCountDto implements Serializable {
private Integer applyUserId;
private Integer applyDeptId;
private String applyUserName;
private String applyDeptName;
private Integer schoolId;
private Float otTimeCount;
private Date startTime;
private Date endTime;
private List < Integer > applyUserIds;
private Integer sort = 1 ;
private Integer pageSize;
private Integer pageNum;
private Integer searchAll;
private Integer setting = 1 ;
方法一
清除之前的分页设置
PageHelper . clearPage ( ) ;
方法二
page. setSize ( - 1L ) ;
private Integer pageSize;
private Integer pageNum;
我怀疑是这两个参数的问题,于是将
private Integer pageSize 改成
private Integer pageSSS
Map < String , Object > stringObjectMap = BeanUtil . beanToMap ( otCountDto) ;
对应的mapper和xml文件如下
public List < OtCountVo > selectOtsByOtCountDtos ( @Param ( "params" ) Map < String , Object > params) ;
< select id= "selectOtsByOtCountDtos" resultMap= "OAOTResultMap" parameterType= "java.util.Map" >
SELECT apply_user_id, apply_user_name,
GROUP_CONCAT( DISTINCT apply_dept_name ORDER BY apply_dept_name ASC SEPARATOR '、' ) AS apply_dept_name,
sum ( ot_time_count) as sumOtTimeCount
FROM t_oa_ot
< trim prefix= "WHERE" prefixOverrides= "AND" >
< if test= "params.startTime != null" > AND create_time >=
< if test= "params.endTime != null " > AND
< if test= "params.applyUserIds != null and params.applyUserIds.size() > 0" >
AND apply_user_id IN
< foreach item= "params.applyUserId" collection= "params.applyUserIds" open = "(" separator= "," close = ")" >
< / foreach>
< / if >
< / trim>
GROUP BY apply_user_id
< / select >
开始继续深究分页问题,查了很多资料,说是可能线程污染,在其他方法调用了startPage(),
但是发生异常没有调用对应的sql,当前线程ThreadLocal设置了分页参数但是没有被消费,
就会导致线程污染,于是我开始查看日志,确定没有此问题,但还是进行了分页,不懂,求大佬解答
List < Country > list;
if ( param1 != null ) {
PageHelper . startPage ( 1 , 10 ) ;
try {
list = countryMapper. selectAll ( ) ;
} finally {
PageHelper . clearPage ( ) ;
}
} else {
list = new ArrayList < Country > ( ) ;
}