spring jpa的隨機 排序使用

輸入圖片說明 輸入圖片說明

這邊的page 開始應該是0  不是1



重寫的pageRequest


import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;

import com.google.common.collect.Lists;


public class PageRequest implements Serializable {

	/** The Constant serialVersionUID. */
	private static final long serialVersionUID = 9100768518781654128L;

	/** 搜索關鍵詞 */
	private String searchText = "";

	/** The page no. */
	protected int pageNo = 1;

	/** The page size. */
	protected int pageSize = 10;

	/** The order by. */
	protected String orderBy = null;

	/** The order dir. */
	protected String orderDir = null;

	/** The order type. */
	protected String orderType = null;

	/** The count total. */
	protected boolean countTotal = true;

	/** The sort. */
	protected Sort sort;

	/** The search debug. */
	protected boolean searchDebug = false;

	/**
	 * Instantiates a new page request.
	 */
	public PageRequest() {
	}

	/**
	 * Instantiates a new page request.
	 * 
	 * @param pageNo
	 *            the page no
	 * @param pageSize
	 *            the page size
	 */
	public PageRequest(int pageNo, int pageSize) {
		this.pageNo = pageNo;
		this.pageSize = pageSize;
	}

	/**
	 * Gets the page no.
	 * 
	 * @return the page no
	 */
	public int getPageNo() {
		return pageNo;
	}

	/**
	 * Sets the page no.
	 * 
	 * @param pageNo
	 *            the new page no
	 */
	public void setPageNo(final int pageNo) {
		this.pageNo = pageNo;

		if (pageNo < 1) {
			this.pageNo = 1;
		}
	}

	/**
	 * Gets the page size.
	 * 
	 * @return the page size
	 */
	public int getPageSize() {
		return pageSize;
	}

	/**
	 * Sets the page size.
	 * 
	 * @param pageSize
	 *            the new page size
	 */
	public void setPageSize(final int pageSize) {
		this.pageSize = pageSize;

		if (pageSize < 1) {
			this.pageSize = 1;
		}
	}

	/**
	 * Gets the order by.
	 * 
	 * @return the order by
	 */
	public String getOrderBy() {
		return orderBy;
	}

	/**
	 * Sets the order by.
	 * 
	 * @param orderBy
	 *            the new order by
	 */
	public void setOrderBy(final String orderBy) {
		this.orderBy = orderBy;
	}

	/**
	 * Gets the order dir.
	 * 
	 * @return the order dir
	 */
	public String getOrderDir() {
		return orderDir;
	}

	/**
	 * Sets the order dir.
	 * 
	 * @param orderDir
	 *            the new order dir
	 */
	public void setOrderDir(final String orderDir) {
		if (StringUtils.isNotBlank(orderDir)) {
			String lowcaseOrderDir = StringUtils.lowerCase(orderDir);

			// 檢查order字符串的合法值
			String[] orderDirs = StringUtils.split(lowcaseOrderDir, ',');
			for (String orderDirStr : orderDirs) {
				if (!StringUtils.equalsIgnoreCase(Direction.DESC.name(), orderDirStr) && !StringUtils.equalsIgnoreCase(Direction.ASC.name(), orderDirStr)) {
					throw new IllegalArgumentException("排序方向" + orderDirStr + "不是合法值");
				}
			}

			this.orderDir = lowcaseOrderDir;
		}
	}

	/**
	 * Gets the order type.
	 * 
	 * @return the order type
	 */
	public String getOrderType() {
		return orderType;
	}

	/**
	 * Sets the order type.
	 * 
	 * @param orderType
	 *            the new order type
	 */
	public void setOrderType(String orderType) {
		this.orderType = orderType;
	}

	/**
	 * Gets the sort.
	 * 
	 * @return the sort
	 */
	public Sort getSort() {
		List<Order> orders = Lists.newArrayList();
		if (StringUtils.isNotBlank(orderBy) && StringUtils.isNotBlank(orderDir)) {
			String[] orderBys = StringUtils.split(orderBy, ',');
			String[] orderDirs = StringUtils.split(orderDir, ',');
			Validate.isTrue(orderBys.length == orderDirs.length, "分頁多重排序參數中,排序字段與排序方向的個數不相等");
			for (int i = 0; i < orderBys.length; i++) {
				orders.add(new Order(Direction.fromString(orderDirs[i]), orderBys[i]));
			}
		}
		if (this.sort != null) {
			orders.addAll(this.sort.orders);
		}
		if (!orders.isEmpty())
			return new Sort(orders);
		return new Sort();
	}

	/**
	 * Sets the sort.
	 * 
	 * @param sort
	 *            the new sort
	 */
	public void setSort(Sort sort) {
		this.sort = sort;
	}

	/**
	 * Checks if is order by setted.
	 * 
	 * @return true, if is order by setted
	 */
	public boolean isOrderBySetted() {
		return (StringUtils.isNotBlank(orderBy) && StringUtils.isNotBlank(orderDir));
	}

	/**
	 * Checks if is count total.
	 * 
	 * @return true, if is count total
	 */
	public boolean isCountTotal() {
		return countTotal;
	}

	/**
	 * Sets the count total.
	 * 
	 * @param countTotal
	 *            the new count total
	 */
	public void setCountTotal(boolean countTotal) {
		this.countTotal = countTotal;
	}

	/**
	 * Gets the offset.
	 * 
	 * @return the offset
	 */
	public int getOffset() {
		return ((pageNo - 1) * pageSize);
	}

	/**
	 * The Enum Direction.
	 * 
	 * @author
	 */
	public static enum Direction {

		/** The ASC. */
		ASC,

		/** The DESC. */
		DESC;

		/**
		 * From string.
		 * 
		 * @param value
		 *            the value
		 * @return the direction
		 */
		public static Direction fromString(String value) {

			try {
				return Direction.valueOf(value.toUpperCase(Locale.US));
			} catch (Exception e) {
				throw new IllegalArgumentException(String.format("Invalid value '%s' for orders given! Has to be either 'desc' or 'asc' (case insensitive).", value), e);
			}
		}
	}

	/**
	 * The Class Order.
	 * 
	 * @author
	 */
	public static class Order implements Serializable {

		/** The Constant serialVersionUID. */
		private static final long serialVersionUID = 1522511010900108987L;

		/** The direction. */
		private Direction direction;

		/** The property. */
		private String property;

		/**
		 * Instantiates a new order.
		 */
		public Order() {
			super();
		}

		/**
		 * Instantiates a new order.
		 * 
		 * @param direction
		 *            the direction
		 * @param property
		 *            the property
		 */
		public Order(Direction direction, String property) {

			// if (property == null || "".equals(property.trim())) {
			// throw new
			// IllegalArgumentException("PropertyPath must not null or empty!");
			// }

			this.direction = direction == null ? Sort.DEFAULT_DIRECTION : direction;
			this.property = property;
		}

		/**
		 * Instantiates a new order.
		 * 
		 * @param property
		 *            the property
		 */
		public Order(String property) {
			this(Sort.DEFAULT_DIRECTION, property);
		}

		/**
		 * Creates the.
		 * 
		 * @param direction
		 *            the direction
		 * @param properties
		 *            the properties
		 * @return the list
		 */
		public static List<Order> create(Direction direction, Iterable<String> properties) {

			List<Order> orders = new ArrayList<Order>();
			for (String property : properties) {
				orders.add(new Order(direction, property));
			}
			return orders;
		}

		/**
		 * Gets the direction.
		 * 
		 * @return the direction
		 */
		public Direction getDirection() {
			return direction;
		}

		/**
		 * Gets the property.
		 * 
		 * @return the property
		 */
		public String getProperty() {
			return property;
		}

		/**
		 * Checks if is ascending.
		 * 
		 * @return true, if is ascending
		 */
		public boolean isAscending() {
			return this.direction.equals(Direction.ASC);
		}

		/**
		 * With.
		 * 
		 * @param order
		 *            the order
		 * @return the order
		 */
		public Order with(Direction order) {
			return new Order(order, this.property);
		}

		/**
		 * With properties.
		 * 
		 * @param properties
		 *            the properties
		 * @return the sort
		 */
		public Sort withProperties(String... properties) {
			return new Sort(this.direction, properties);
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see java.lang.Object#hashCode()
		 */
		@Override
		public int hashCode() {

			int result = 17;

			result = 31 * result + direction.hashCode();
			result = 31 * result + property.hashCode();

			return result;
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see java.lang.Object#equals(java.lang.Object)
		 */
		@Override
		public boolean equals(Object obj) {

			if (this == obj) {
				return true;
			}

			if (!(obj instanceof Order)) {
				return false;
			}

			Order that = (Order) obj;

			return this.direction.equals(that.direction) && this.property.equals(that.property);
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see java.lang.Object#toString()
		 */
		@Override
		public String toString() {
			return String.format("%s: %s", property, direction);
		}
	}

	/**
	 * The Class Sort.
	 * 
	 * @author
	 */
	public static class Sort implements Serializable, Iterable<Order> {

		/** The Constant serialVersionUID. */
		private static final long serialVersionUID = -6732052557382112251L;

		/** The Constant DEFAULT_DIRECTION. */
		public static final Direction DEFAULT_DIRECTION = Direction.ASC;

		/** The orders. */
		private List<Order> orders = Lists.newArrayList();

		/**
		 * Instantiates a new sort.
		 */
		public Sort() {
			super();
		}

		/**
		 * Instantiates a new sort.
		 * 
		 * @param orders
		 *            the orders
		 */
		public Sort(Order... orders) {
			this(Arrays.asList(orders));
		}

		/**
		 * Instantiates a new sort.
		 * 
		 * @param orders
		 *            the orders
		 */
		public Sort(List<Order> orders) {

			if (null == orders || orders.isEmpty()) {
				throw new IllegalArgumentException("You have to provide at least one sort property to sort by!");
			}

			this.orders = orders;
		}

		/**
		 * Instantiates a new sort.
		 * 
		 * @param properties
		 *            the properties
		 */
		public Sort(String... properties) {

			this(DEFAULT_DIRECTION, properties);
		}

		/**
		 * Instantiates a new sort.
		 * 
		 * @param direction
		 *            the direction
		 * @param properties
		 *            the properties
		 */
		public Sort(Direction direction, String... properties) {

			this(direction, properties == null ? new ArrayList<String>() : Arrays.asList(properties));
		}

		/**
		 * Instantiates a new sort.
		 * 
		 * @param direction
		 *            the direction
		 * @param properties
		 *            the properties
		 */
		public Sort(Direction direction, List<String> properties) {

			if (properties == null || properties.isEmpty()) {
				throw new IllegalArgumentException("You have to provide at least one property to sort by!");
			}

			this.orders = new ArrayList<Order>(properties.size());

			for (String property : properties) {
				this.orders.add(new Order(direction, property));
			}
		}

		/**
		 * And.
		 * 
		 * @param sort
		 *            the sort
		 * @return the sort
		 */
		public Sort and(Sort sort) {

			if (sort == null) {
				return this;
			}

			ArrayList<Order> these = new ArrayList<Order>(this.orders);

			for (Order order : sort) {
				these.add(order);
			}

			return new Sort(these);
		}

		/**
		 * Gets the order for.
		 * 
		 * @param property
		 *            the property
		 * @return the order for
		 */
		public Order getOrderFor(String property) {

			for (Order order : this) {
				if (order.getProperty().equals(property)) {
					return order;
				}
			}

			return null;
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see java.lang.Iterable#iterator()
		 */
		public Iterator<Order> iterator() {

			return this.orders.iterator();
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see java.lang.Object#equals(java.lang.Object)
		 */
		@Override
		public boolean equals(Object obj) {

			if (this == obj) {
				return true;
			}

			if (!(obj instanceof Sort)) {
				return false;
			}

			Sort that = (Sort) obj;

			return this.orders.equals(that.orders);
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see java.lang.Object#hashCode()
		 */
		@Override
		public int hashCode() {

			int result = 17;
			result = 31 * result + orders.hashCode();
			return result;
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see java.lang.Object#toString()
		 */
		@Override
		public String toString() {

			return org.springframework.util.StringUtils.collectionToCommaDelimitedString(orders);
		}

		/**
		 * Gets the orders.
		 * 
		 * @return the orders
		 */
		public List<Order> getOrders() {
			return orders;
		}

		/**
		 * Sets the orders.
		 * 
		 * @param orders
		 *            the new orders
		 */
		public void setOrders(List<Order> orders) {
			this.orders = orders;
		}

	}

	/**
	 * Checks if is search debug.
	 * 
	 * @return true, if is search debug
	 */
	public boolean isSearchDebug() {
		return searchDebug;
	}

	/**
	 * Sets the search debug.
	 * 
	 * @see cn.com.summall.commons.Page#debugMsg
	 * @param searchDebug
	 *            the new search debug
	 */
	public void setSearchDebug(boolean searchDebug) {
		this.searchDebug = searchDebug;
	}

	/**
	 * get searchText
	 * 
	 * @return
	 * @author nibili 2016年1月8日
	 */
	public String getSearchText() {
		return searchText;
	}

	/**
	 * set searchText
	 * 
	 * @param searchText
	 * @author nibili 2016年1月8日
	 */
	public void setSearchText(String searchText) {
		this.searchText = searchText;
	}

}
相關文章
相關標籤/搜索