package org.exitsoft.orm.core; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.springframework.util.Assert; /** * 分页参数封装类. * @author vincent */ public class PageRequest { /** * 第几页 */ protected int pageNo = 1; /** * 每页大小 */ protected int pageSize = 10; /** * 排序字段 */ protected String orderBy = null; /** * 排序方式 * @see Sort */ protected String orderDir = null; /** * 是否默认计算总记录数. */ protected boolean countTotal = true; /** * 构造方法 */ public PageRequest() { } /** * 构造方法 * @param pageNo 第几页 * @param pageSize 每页分页大小 */ public PageRequest(int pageNo, int pageSize) { this.pageNo = pageNo; this.pageSize = pageSize; } /** * 获得当前页的页号, 序号从1开始, 默认为1. */ public int getPageNo() { return pageNo; } /** * 设置当前页的页号, 序号从1开始, 低于1时自动调整为1. */ public void setPageNo(final int pageNo) { this.pageNo = pageNo; if (pageNo < 1) { this.pageNo = 1; } } /** * 获得每页的记录数量, 默认为10. */ public int getPageSize() { return pageSize; } /** * 设置每页的记录数量, 低于1时自动调整为1. */ public void setPageSize(final int pageSize) { this.pageSize = pageSize; if (pageSize < 1) { this.pageSize = 1; } } /** * 获得排序字段, 无默认值. 多个排序字段时用','分隔. */ public String getOrderBy() { return orderBy; } /** * 设置排序字段, 多个排序字段时用','分隔. */ public void setOrderBy(final String orderBy) { this.orderBy = orderBy; } /** * 获得排序方向, 无默认值. */ public String getOrderDir() { return orderDir; } /** * 设置排序方式向. * * @param orderDir 可选值为desc或asc,多个排序字段时用','分隔. */ public void setOrderDir(final String orderDir) { String lowcaseOrderDir = StringUtils.lowerCase(orderDir); //检查order字符串的合法值 String[] orderDirs = StringUtils.split(lowcaseOrderDir, ','); for (String orderDirStr : orderDirs) { if (!StringUtils.equals(Sort.DESC, orderDirStr) && !StringUtils.equals(Sort.ASC, orderDirStr)) { throw new IllegalArgumentException("排序方向" + orderDirStr + "不是合法值"); } } this.orderDir = lowcaseOrderDir; } /** * 获得排序参数. */ @SuppressWarnings("unchecked") public List<Sort> getSort() { if (orderBy == null || orderDir == null) { return Collections.EMPTY_LIST; } String[] orderBys = StringUtils.split(orderBy, ','); String[] orderDirs = StringUtils.split(orderDir, ','); Assert.isTrue(orderBys.length == orderDirs.length, "分页多重排序参数中,排序字段与排序方向的个数不相等"); List<Sort> orders = new ArrayList<PageRequest.Sort>(); for (int i = 0; i < orderBys.length; i++) { orders.add(new Sort(orderBys[i], orderDirs[i])); } return orders; } /** * 是否已设置排序字段,无默认值. */ public boolean isOrderBySetted() { return (StringUtils.isNotBlank(orderBy) && StringUtils.isNotBlank(orderDir)); } /** * 是否默认计算总记录数. */ public boolean isCountTotal() { return countTotal; } /** * 设置是否默认计算总记录数. */ public void setCountTotal(boolean countTotal) { this.countTotal = countTotal; } /** * 根据pageNo和pageSize计算当前页第一条记录在总结果集中的位置, 序号从0开始. */ public int getOffset() { return ((pageNo - 1) * pageSize); } /** * 获取Order By后的sql字符串 * @return String */ public String getOrderSortString() { List<Sort> list = this.getSort(); StringBuffer buffer = new StringBuffer(); for (Iterator<Sort> it = list.iterator(); it.hasNext();) { Sort sort = it.next(); buffer.append(sort.property + " " + sort.dir).append(","); } return StringUtils.substringBeforeLast(buffer.toString(), ","); } /** * 排序方式 * * @author vincent * */ public static class Sort { public static final String ASC = "asc"; public static final String DESC = "desc"; private final String property; private final String dir; /** * 构造方法 * @param property 要排序的字段 * @param dir 排序方式 */ public Sort(String property, String dir) { this.property = property; this.dir = dir; } /** * 获取排序字段 * @return String */ public String getProperty() { return property; } /** * 获取排序方式 * @return */ public String getDir() { return dir; } } }