分页插件的坑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);”这一段代码就不会出现类型转换异常了。但是为什么加上了这段调用条件的方法就会出错呢?
因为这段代码PageHelper.startPage(pageNum, pageSize);只会对靠近的第一个select查询语句进行分页,也就试试说我调用的addCriteriaByRoles(criteria);方法里面获取用户角色(如下图)有select查询语句,就对它进行分页了
而我后面的查询语句并没有进行分页,如下图
在这中情况下,强制的将list集合转换为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#重要提示
希望能对你有所帮助!