有时,复杂的多表关连统计分析用sql分页足够折磨人的,因此有了下面的方法,可以把需要统计的数据从数据库单表查出来,在代码层做统计分析,完后用代码分页,效果尚可。
// 手工对集合进行分页
public static <T> List<T> page(List<T> ts, Integer pageNo, Integer pageSize) {
if (DrinStringUtils.isNull(ts, pageNo, pageSize)) {
return ts;
}
int size = ts.size();
if (pageNo > size) {
return new ArrayList<>();
}
pageNo = pageNo < 1 ? 1 : pageNo;
int startIndex = (pageNo - 1) * pageSize;
int endIndex = startIndex + pageSize;
List<T> pageList = new ArrayList<>();
for (int i = 0; i < size; i++) {
if (i >= startIndex && i < endIndex) {
pageList.add(ts.get(i));
}
}
return pageList;
}
搭配的使用封装类:
public class Page<E, S> implements Serializable {
private static final long serialVersionUID = 1L;
private long total = 0;
private List<E> data;
public JsonResult toResult() {
return new JsonResult(this.data, this.total);
}
public Page(List<E> list) {
doPage(list, null, false);
}
public Page(List<E> list, Function<E, S> sortFun) {
doPage(list, sortFun, false);
}
public Page(List<E> list, Function<E, S> sortFun, boolean isDesc) {
doPage(list, sortFun, isDesc);
}
public Page(List<E> list, Integer pageNo, Integer pageSize) {
doPage(list, pageNo, pageSize, null, false);
}
public Page(List<E> list, Integer pageNo, Integer pageSize, Function<E, S> sortFun) {
doPage(list, pageNo, pageSize, sortFun, false);
}
public Page(List<E> list, Integer pageNo, Integer pageSize, Function<E, S> sortFun, boolean isDesc) {
doPage(list, pageNo, pageSize, sortFun, isDesc);
}
public List<E> getData() {
return data;
}
public long getTotal() {
return total;
}
private void doPage(List<E> list, Function<E, S> sortFun, boolean isDesc) {
HttpServletRequest request = SystemUtils.getRequest();
if (null == request) {
doPage(list, null, null, sortFun, false);
return;
}
String pageNo = request.getParameter("pageNo");
String pageSize = request.getParameter("pageSize");
if (DrinStringUtils.isNull(pageNo, pageSize)) {
doPage(list, null, null, sortFun, false);
} else {
Integer num = Integer.parseInt(pageNo);
Integer size = Integer.parseInt(pageSize);
doPage(list, num, size, sortFun, false);
}
}
private void doPage(List<E> list, Integer pageNo, Integer pageSize, Function<E, S> sortFun, boolean isDesc) {
if (noNeedToPage(list, pageNo, pageSize)) {
this.total = null != list ? list.size() : 0;
this.data = null != list ? list : new ArrayList<>();
} else {
this.total = list.size();
// 排个序
toSortList(list, sortFun, isDesc);
this.data = DrinListUtils.page(list, pageNo, pageSize);
}
}
private boolean noNeedToPage(List<E> list, Integer pageNo, Integer pageSize) {
return null == list || list.size() == 0 || null == pageNo || null == pageSize;
}
private void toSortList(List<E> list, Function<E, S> sortFun, boolean isDesc) {
if (null == sortFun) {
return;
}
Class<?> classSort = resolverClass(list, sortFun);
if (null == classSort) {
return;
}
boolean isInt = classSort.isAssignableFrom(Integer.class);
boolean isLong = classSort.isAssignableFrom(Long.class);
boolean isDouble = classSort.isAssignableFrom(Double.class);
boolean isString = classSort.isAssignableFrom(String.class);
list.sort((d1, d2) -> {
Object s1 = null == d1 ? null : sortFun.apply(d1);
Object s2 = null == d2 ? null : sortFun.apply(d2);
if (isDesc) {
if (isInt) {
s1 = null == s1 ? Integer.MIN_VALUE : s1;
s2 = null == s2 ? Integer.MIN_VALUE : s2;
} else if (isLong) {
s1 = null == s1 ? Long.MIN_VALUE : s1;
s2 = null == s2 ? Long.MIN_VALUE : s2;
} else if (isDouble) {
s1 = null == s1 ? Double.MIN_VALUE : s1;
s2 = null == s2 ? Double.MIN_VALUE : s2;
} else if (isString) {
s1 = null == s1 ? String.valueOf(Long.MIN_VALUE) : s1;
s2 = null == s2 ? String.valueOf(Long.MIN_VALUE) : s2;
} else {
s1 = null == s1 ? Integer.MIN_VALUE : s1;
s2 = null == s2 ? Integer.MIN_VALUE : s2;
}
} else {
if (isInt) {
s1 = null == s1 ? Integer.MAX_VALUE : s1;
s2 = null == s2 ? Integer.MAX_VALUE : s2;
} else if (isLong) {
s1 = null == s1 ? Long.MAX_VALUE : s1;
s2 = null == s2 ? Long.MAX_VALUE : s2;
} else if (isDouble) {
s1 = null == s1 ? Double.MAX_VALUE : s1;
s2 = null == s2 ? Double.MAX_VALUE : s2;
} else if (isString) {
s1 = null == s1 ? String.valueOf(Long.MAX_VALUE) : s1;
s2 = null == s2 ? String.valueOf(Long.MAX_VALUE) : s2;
} else {
s1 = null == s1 ? Integer.MAX_VALUE : s1;
s2 = null == s2 ? Integer.MAX_VALUE : s2;
}
}
if (isInt) {
Integer i1 = (Integer) s1;
Integer i2 = (Integer) s2;
return isDesc ? i2.compareTo(i1) : i1.compareTo(i2);
} else if (isLong) {
Long i1 = (Long) s1;
Long i2 = (Long) s2;
return isDesc ? i2.compareTo(i1) : i1.compareTo(i2);
} else if (isDouble) {
Double i1 = (Double) s1;
Double i2 = (Double) s2;
return isDesc ? i2.compareTo(i1) : i1.compareTo(i2);
} else if (isString) {
try {
Long i1 = Long.parseLong((String) s1);
Long i2 = Long.parseLong((String) s2);
return isDesc ? i2.compareTo(i1) : i1.compareTo(i2);
} catch (NumberFormatException e) {
return 0;
}
} else {
Integer i1 = (Integer) s1;
Integer i2 = (Integer) s2;
return isDesc ? i2.compareTo(i1) : i1.compareTo(i2);
}
});
}
private Class<?> resolverClass(List<E> list, Function<E, S> sortFun) {
for (E e : list) {
S apply = sortFun.apply(e);
if (null != apply) {
return apply.getClass();
}
}
return null;
}
}
使用示例
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(6);
list.add(null);
list.add(2);
list.add(null);
list.add(4);
Page<Integer, Integer> page1 = new Page<>(list, 1, 3, l -> l, false);
Page<Integer, Integer> page2 = new Page<>(list, 2, 3, l -> l, false);
System.out.println("page1.getData()=" + page1.getData());// [1, 2, 4]
System.out.println("page2.toResult()=" + page2.toResult());// [1, 2, 4]
}
console:
page1.getData()=[1, 2, 4]
page2.toResult()=JsonResult [code=200, message=操作成功, data=[6, null, null], total=6]