记录一个关于PageHelper的坑

记录一个关于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>>();
        /**判断 学校id**/
        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) {
//        清除之前的分页设置
//        PageHelper.clearPage();
        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);
//此方法生效了,但是出现了一个奇怪的bug,sum函数聚合查询的数据没了
//注意看OtCountDto实体类中的两个属性
    private Integer pageSize;     //怀疑对象
    private Integer pageNum;     //怀疑对象
    我怀疑是这两个参数的问题,于是将
    private Integer pageSize  改成
    private Integer pageSSS
//于是成了,不进行分页查询了,我也不知道为什么
//开始说解决方法,上面更改参数名解决了问题,但是为了命名规范,舍弃了上面的方法
//使用BeanUtil转成map集合
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 >= #{params.startTime}</if>
            <if test="params.endTime != null "> AND #{params.endTime} >= create_time </if>
        <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=")">
                #{params.applyUserId}
            </foreach>
        </if>
        </trim>
        GROUP BY apply_user_id
</select>
开始继续深究分页问题,查了很多资料,说是可能线程污染,在其他方法调用了startPage(),
但是发生异常没有调用对应的sql,当前线程ThreadLocal设置了分页参数但是没有被消费,
就会导致线程污染,于是我开始查看日志,确定没有此问题,但还是进行了分页,不懂,求大佬解答
//记录一个安全使用PageHelper的方法
List<Country> list;
if(param1 != null){
    PageHelper.startPage(1, 10);
    try{
        list = countryMapper.selectAll();
    } finally {
        PageHelper.clearPage();
    }
} else {
    list = new ArrayList<Country>();
}

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用PageHelper进行分页查询时,你需要引入PageHelper的依赖,然后在你的查询方法中使用PageHelper来进行分页操作。以下是一个示例: 首先,确保在你的项目中添加了PageHelper的依赖。如果是使用Maven来管理依赖,可以在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.2.1</version> </dependency> ``` 接下来,假设你有一个User实体类,包含了id、name和age属性。你可以使用如下代码进行分页查询: ```java import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import java.util.List; public class UserDAO { public List<User> getUsersByPage(int pageNum, int pageSize) { // 设置分页参数 PageHelper.startPage(pageNum, pageSize); // 执行查询操作,获取分页结果 List<User> userList = yourUserMapper.getUsers(); // 封装分页结果 PageInfo<User> pageInfo = new PageInfo<>(userList); return pageInfo.getList(); } } ``` 在上面的代码中,`pageNum`表示要查询的页码,`pageSize`表示每页的记录数。`PageHelper.startPage(pageNum, pageSize)`方法会将该查询设置为分页查询,并在查询之前自动计算出需要查询的起始行和记录数。 你需要将`yourUserMapper.getUsers()`替换为你自己的查询方法,该方法应该返回所有的User实体对象列表。 最后,通过`PageInfo`来封装分页结果,然后通过`pageInfo.getList()`方法获取当前页的数据列表。 请注意,此示例假设你已经正确配置了MyBatis和对应的Mapper接口。另外,你可能需要根据你的实际情况进行一些修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值