天天看點

解決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!