解决PageHelper无法进行多表查询分页

起因:PageHelper--bug:

com.github.pagehelper.Page<Map<String, Object>> page = PageHelper.startPage(vo.getPageNo(), vo.getPageSize());

网上的PageHelper工具类有个bug,只会对上面代码紧跟着的sql语句查询结果进行分页,但是工作中难免有这样的需求:

将A表查询出来的List与B表查询出来的List合并后展示,这就很尴尬了!!!

怎么解决?抛弃PageHelper呗,我称之为:内存分页--只适用于查询j结果量不大的情况,一般可以满足

1>新建Page类

/**
 * 页面包装类
 */
public class Page {
    //当前页面
    private int pageNo = 1;
    //每页显示数量
    private int pageSize = 10;
    //总数
    private long totalCount = 0;
    //总页数
    private int totalPage = 1;

    public long getTotalPage() {
        return totalCount % pageSize == 0 ? totalCount / pageSize : totalCount / pageSize + 1;
    }

    public int limitStart() {
        return pageSize * (getPageNo() - 1);
    }

    public int limitEnd() {
        return pageSize;
    }

    public int getPageNo() {
        if(pageNo > getTotalPage()) {
            return totalPage;
        }
        return pageNo;
    }

    public Page setPageNo(int pageNo) {
        this.pageNo = pageNo;
        return this;
    }

    public int getPageSize() {
        return pageSize;
    }

    public Page setPageSize(int pageSize) {
        this.pageSize = pageSize;
        return this;
    }

    public long getTotalCount() {
        return totalCount;
    }

    public Page setTotalCount(long totalCount) {
        this.totalCount = totalCount;
        return this;
    }

    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }
}

2>代码里这么写

     //新建分页工具类
    Page page = new Page().setPageNo(pageNo).setPageSize(pageSize);
    //A表查询list
    List<Map<String, Object>> listA = orderClassPackageMapper.listbackDelete(vo);
    //B表查询list
    List<Map<String, Object>> listB = orderMapper.listbackDelete(vo);
    //合并list
    listA.addAll(listB);
    //对list进行排序,两张表必须有一个统一的排序字段,如这里的deleteTime
    Collections.sort(listA, new Comparator<Map<String, Object>>() {
        public int compare(Map<String, Object> o1, Map<String, Object> o2) {
            Date deleteTime1 = new Date();
            Date deleteTime2 = new Date();
            try {
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                deleteTime1 = sdf.parse(o1.get("deleteTime").toString());
                deleteTime2 = sdf.parse(o2.get("deleteTime").toString());
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return DateUtils.compareDate(deleteTime1, deleteTime2);//比较时间工具类
        }
    });
    page.setTotalCount(listA.size());
    //内存分页
    List<Map<String, Object>> subList = listA.subList(vo.getPageSize() * (vo.getPageNo()-1), ((vo.getPageSize() * vo.getPageNo()) > listA.size() ? listA.size() : (vo.getPageSize() * vo.getPageNo())));
    return subList;

贴一下时间比较方法

public static int compareDate(Date start, Date end) {
		if ((start != null) && (end != null)) {
			return (end.getTime() < start.getTime()?-1: ((end.getTime() == start.getTime()) ? 0 : 1));
		}
		return 0;
	}

ok,就是这么easy!

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值