分页插件的坑java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.github.pagehelper.Page

今天我不得不吐槽一遍分页插件PageHelper,因为这里面有一个大坑,天坑。从昨天下午到今天上午,这个bug困扰了我4个小时,现在终于知道了,为了以后不出现这样的错误,大家可以了解一下。
bug代码如下

/**
	 * 按分页查询
	 */
	@Override
	public PageResult findPage(int pageNum, int pageSize) {
		//将查询结果进行分页
		PageHelper.startPage(pageNum, pageSize);
		TProjectDataExample example=new TProjectDataExample();
		TProjectDataExample.Criteria criteria = example.createCriteria();
		//根据角色添加查询条件
		addCriteriaByRoles(criteria);
		//只查询状态为1的数据
		criteria.andStatusEqualTo("1");

	List<TProjectData> list = projectDataMapper.selectByExample(example);
	for (TProjectData TProjectData: list) {
		//承担单位
		if(TProjectData.getOrganizer() != null && TProjectData.getOrganizer().length()>0){
			//将承担单位取出,并用“,”进行切割,取第一个单位放回实体类
			String [] organizers = TProjectData.getOrganizer().split(",");
			TProjectData.setOrganizer(organizers[0]);
		}
	}
	Page<TProjectData> page = (Page<TProjectData>) list;
	return new PageResult(page.getTotal(), page.getResult());
}

/**
 * 根据角色添加查询条件
 * @param criteria
 */
private void addCriteriaByRoles(TProjectDataExample.Criteria criteria) {
	Subject subject = SecurityUtils.getSubject();//获取subject
	UUser currentUser = (UUser)subject.getPrincipal();
	if (currentUser != null) {
		List<URole> rlist = roleService.findRoleByUid(currentUser.getId());//获取用户角色
		//根据角色的获取不同的数据,如果是admin或省级角色,查询所有的数据,如果是市级权限,查询本市的数据,
		// 如果是单位权限,查询本单位的数据,如果是个人的角色,查询个人的数据
		for (URole role : rlist) {
			if("admin".equals(role.getName())){
				//不添加任何限制条件
			}else if("省级".equals(role.getName())){
				//不添加任何限制条件
			}else if("地市级".equals(role.getName())){
				if(currentUser.getArea()!=null && currentUser.getArea().length()>0){
					System.out.println(currentUser.getArea()+11111);
					//添加本市的名称
					criteria.andAreaEqualTo(currentUser.getArea());
				}
			}else if("医院".equals(role.getName())){
				if(currentUser.getCompany()!=null && currentUser.getCompany().length()>0){
					//添加本单位的名称
					criteria.andOrganizerEqualTo(currentUser.getCompany());
				}
				if(currentUser.getArea()!=null && currentUser.getArea().length()>0){
					//添加本人所属地区
					criteria.andAreaEqualTo(currentUser.getArea());
				}
			}else if("个人".equals(role.getName())){
				if(currentUser.getCompany()!=null && currentUser.getCompany().length()>0){
					//添加本单位的名称
					criteria.andOrganizerEqualTo(currentUser.getCompany());
				}
				if(currentUser.getArea()!=null && currentUser.getArea().length()>0){
					//添加本人所属地区
					criteria.andAreaEqualTo(currentUser.getArea());
				}
				if(currentUser.getUsername()!=null && currentUser.getUsername().length()>0){
					//添加本人的名称
					criteria.andProjectLeaderEqualTo(currentUser.getUsername());
				}
			}
			System.out.println(role.getName());
		}
	}
}

上面的代码存在一个问题,即java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.github.pagehelper.Page,当我们去掉“//根据角色添加查询条件 addCriteriaByRoles(criteria);”这一段代码就不会出现类型转换异常了。但是为什么加上了这段调用条件的方法就会出错呢?
分页插件的坑java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.github.pagehelper.Page

因为这段代码PageHelper.startPage(pageNum, pageSize);只会对靠近的第一个select查询语句进行分页,也就试试说我调用的addCriteriaByRoles(criteria);方法里面获取用户角色(如下图)有select查询语句,就对它进行分页了
分页插件的坑java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.github.pagehelper.Page

而我后面的查询语句并没有进行分页,如下图
分页插件的坑java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.github.pagehelper.Page
在这中情况下,强制的将list集合转换为page集合,就会出现类型转换异常
java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.github.pagehelper.Page
因此,我们必须要将分页的位置进行调换一下
分页插件的坑java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.github.pagehelper.Page
这样就不会出现类型转换异常了

注意:
pageHelper只对紧跟着的查询结果进行分页!!!!!!!!
pageHelper只对紧跟着的查询结果进行分页!!!!!!!!

详解:https://blog.****.net/qq_16517483/article/details/72803043#重要提示
分页插件的坑java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.github.pagehelper.Page

希望能对你有所帮助!