java代码中实现查询后controller层分页和排序

  • Post author:
  • Post category:java


今天遇到一个问题,实体类中的一个字段数据会变化,所以不存到数据库中,也不能用”order by xxx desc” 的方式进行排序。

研究了半天,用list.subList()方法实现分页,用Collections.sort()方法实现排序。问题解决,下面是代码:

数据库:oracle

连接方式:jpa

实体类:

@Entity
@Table(name="street_shops")
public class StreetShops extends BaseEntity{
...
private String sum; //得分总数字段
	@Transient(生成数据库时,忽略该字段)
	public String getSum() {
		return sum;
	}
	public void setSum(String sum) {
		this.sum = sum;
	}
...
}

分页实体Page:

public class Page<T> {
	protected transient final Log log = LogFactory.getLog(getClass());
	// 分页显示
	private int sum,// 总数
			sumPages,// 总页数
			curPage=1,// 当前页码
			from, to,// 起止数
			fromPage, toPage;// 起止页码,以1开始计算
	private int per =  20;// 每页显示数
	private int max = 5;
	private List<Integer> page;// 页面输出
	private boolean firstPage, lastPage, prePage, nextPage;// 是否显示:首页,尾页,前页,下页
	private List<T> resultList = new ArrayList<T>();
	
	public Page(){}
	/**
	 * 
	 * @param curPage 当前页码
	 * @param per	每页数量
	 * @param sum	总记录数
	 * @param list	结果集数据
	 */
	public Page(int curPage,int per,int sum,List<T> list){
		this.setCurPage(curPage);
		this.setPer(per);
		this.page(sum);
		this.setResultList(list);
	}
	
	/**
	 * 
	 * @param curPage 当前页码
	 * @param per	每页数量
	 * @param sum	总记录数
	 * @param list	结果集数据
	 * @param max 翻页按钮最大数量
	 */
	public Page(int curPage,int per,int sum,List<T> list,int max){
		this.setCurPage(curPage);
		this.setPer(per);
		this.max = max;
		this.page(sum);
		this.setResultList(list);
	}
	/**
	 * 分页显示
	 */
	// TODO 当 sum 为 0 时,看看 log,及页面的显示,稍微有点不通逻辑。
	public void page(int sum) {
		this.sum = sum;
		if (sum % per != 0) {
			sumPages = sum / per + 1;
		} else {
			sumPages = sum / per;
		}

		// 即刚第一次显示,初始化
		if (curPage == 0) {
			curPage = 1;
		}
		from = (curPage - 1) * per + 1;
		to = curPage * per;
		if (to > sum) {
			to = sum;
		}
		if (sumPages <= max) {
			fromPage = 1;
			toPage = sumPages;
		} else {
			if (curPage <= max/2) {
				fromPage = 1;
				toPage = max;
			} else {
				fromPage = curPage - max/2;
				toPage = curPage + max/2-1;
				if (toPage > sumPages) {
					toPage = sumPages;
				}
			}
		}
		if (fromPage != toPage) {
			page = new ArrayList<Integer>();
			for (int i = fromPage; i <= toPage; i++) {
				page.add(new Integer(i));
			}
		}
		if (fromPage > 1) {
			firstPage = true;
		}
		if (toPage < sumPages) {
			lastPage = true;
		}
		if (curPage > 1) {
			prePage = true;
		}
		if (curPage < toPage) {
			nextPage = true;
		}
		System.out.println("------------------------------------");
		System.out.println("分页算法结果");
		System.out.println("总数:" + sum);
		System.out.println("总页数:" + sumPages);
		System.out.println("当前页码:" + curPage);
		System.out.println("起止数目:[" + from + "," + to + "]");
		System.out.println("起止页码:[" + fromPage + "," + toPage + "]");
		System.out.println("每页显示:" + per);
		System.out.println("是否显示首页:" + firstPage);
		System.out.println("每页显示尾页:" + lastPage);
		System.out.println("每页显示前页:" + prePage);
		System.out.println("每页显示下页:" + nextPage);
		System.out.println("------------------------------------");
	}

	public int getSumPages() {
		return sumPages;
	}

	public boolean isFirstPage() {
		return firstPage;
	}

	public boolean isLastPage() {
		return lastPage;
	}

	public boolean isPrePage() {
		return prePage;
	}

	public boolean isNextPage() {
		return nextPage;
	}

	public int getCurPage() {
		return curPage;
	}

	public void setCurPage(int curPage) {
		this.curPage = curPage;
	}

	public int getFrom() {
		return from;
	}

	public int getTo() {
		return to;
	}

	public List<Integer> getPage() {
		return page;
	}

	public int getSum() {
		return sum;
	}

	public int getPer() {
		return per;
	}

	public void setPer(int per) {
		this.per = per;
	}

	public int getMax() {
		return max;
	}
	public void setMax(int max) {
		this.max = max;
	}
	public List<T> getResultList() {
		return resultList;
	}

	public void setResultList(List<T> resultList) {
		this.resultList = resultList;
	}
	public int getToPage() {
		return toPage;
	}

controller:为了方便观看,将逻辑写在controller层

		//查询所有数据
		List<StreetShops> shopList = streetShopsService.getListStreetShops(params);
		
			//将数据进行排序
			//conllection.sort()方法中,会将list转化成数组,然后调用Array.sort方法进行排序
			//Array.sort默认是正序,需要倒叙就得用到new Comparator<>(){}这个内部类
		Collections.sort(shopList, new Comparator<StreetShops>() {
			@Override
			public int compare(StreetShops o1, StreetShops o2) {
				//这里将字符串转换为int类型
				int sum1=Integer.parseInt(o1.getSum());
				int sum2=Integer.parseInt(o2.getSum());
				int diff =sum2 - sum1;//倒序
				//正序
				// int diff=sum1-sum2;
				if(diff>0){
					return 1;
				}else if(diff<0){
					return -1;
				}
				return 0;//相等为0
				
				//compareTo方法比较的是 等长 字符串的大小,如果字符串长度不相等,会出现误差
				//return o2.getSum().compareTo(o1.getSum());//倒序 
				//return o1.getSum().compareTo(o2.getSum());//正序
			}
		});

		//将数据进行分页
		page.setPer(15);
		int count = 0;
		if(shopList != null && shopList.size() > 0) {
			count = shopList.size();
			//curPage 当前页 ,per 当前数据 
			int fromIndex = (page.getCurPage()-1) * page.getPer(); //起始数据
			int toIndex = page.getCurPage() * page.getPer(); //终止数据
			if (toIndex > count) {
				toIndex = count;
			}
			//list.sunList(起始数据,终止数据)
			List<StreetShops> pageList = shopList.subList(fromIndex, toIndex);
			//将list存入page传给jsp
			page.setResultList(pageList);
			//获取到总数据数  存入page
			int sum = streetShopsService.countCurrentStreetShops(params);
			page.page(sum);

jsp:

<body style="overflow-x: hidden;">
	<div class="col-md-12 page-header">
		<div class="page-title">信用得分统计</div>
	</div>

	<div class="tab-content">
		<div role="tabpanel" class="tab-pane active" id="resource_info">
			<div class="panel panel-default" >
				<div class="panel-body">
					<form class="form-inline" action="${pageContext.request.contextPath}/faren/find/index">
						<div class="form-group">
							<label for="QYMC">所属街道</label> 
							<select name = "street" id="street" class="form-control">
								<option></option>
								<c:forEach var="street" items="${streetList }">
									<option value="${street.id }">${street.name }</option>
								</c:forEach>
							</select>
						</div>
						<div class="form-group">
							<label for="QYMC">企业名称</label> <input type="text"
								class="form-control" id="qymc" name="qymc" value="${qymc }">
						</div>
						<div class="form-group">
							<label for="SHXYDM">企业标识</label> 
							<input type="text" class="form-control" id="shxydm" name="shxydm" value="${shxydm }"> 
						</div>
						<button type="button" class="btn btn-primary btn-sm" onclick="Pager.search('page_bar');">查询</button>
						<button type="button" class="btn btn-primary btn-sm" id="exportExcel" >导出excel</button>
					</form>
				</div>
			</div>
		</div>
	</div>
	<div id="rend_tab">
		<table class="table table-striped table-bordered table-hover table-centered app-margin-md">
			<thead>
				<tr>
					<th width="5%">序号</th>
					<th width="20%">企业名称</th>
					<th width="10%">统一社会信用代码</th>
					<th width="10%">营业执照注册号</th>
					<th width="10%">法定代表人</th>
					<th width="5%">总得分</th>
					<th width="20%">评分</th>
					<th width="10%">操作</th>
				</tr>
			</thead>
			<tbody>
				<c:forEach items="${page.resultList }" var="fr" varStatus="ind">
					<tr>
						<td class="app-align-center">${ind.index +1 }</td>
						<td>${fr.faren.QYMC }</td>
						<td>${fr.faren.SHXYDM }</td>
						<td>${fr.faren.YYZZZCH }</td>
						<td>${fr.faren.FDDBRMC }</td>
						
						<td>
							${fr.sum }
							
						</td>
						<td class="star-box ${fr.starClass }">
							<span class="icon-star"></span>
			                <span class="icon-star"></span>
			                <span class="icon-star"></span>
			                <span class="icon-star"></span>
			                <span class="icon-star"></span>
						</td>
						<td>
							<button type="button" class="btn btn-primary btn-sm mark" name="farenInfo" data-streetshop-id="${fr.id }">
								<span class="glyphicon glyphicon-list-alt" aria-hidden="true"></span> 查看
							</button>
						</td>
					</tr>
				</c:forEach>
			</tbody>
		</table>
		
		<!-- 分页组件 -->
		<div class="hx_button" style="margin-left: 10px;">
			<c:import url="/page/page.jsp">
				<c:param name="page_bar_id">page_bar</c:param>
			</c:import>
		</div>
		<div class="clear"></div>
	</div>
	
	
	
	
</body>
<script src="${pageContext.request.contextPath}/js/jquery-2.1.4.js"></script> 
<script src="${pageContext.request.contextPath}/bootstrap/js/bootstrap.js"></script>
<script src="${pageContext.request.contextPath}/page/page.js"></script>

 <script type="text/javascript">
  		//调整右侧窗口自适应高度
  		$(function(){
  			var config = {
  					"pageId" : "page_bar",
  					"type" : "post",
  					"url" : "${pageContext.request.contextPath}/credit/shop/list",
  					"beforePage" : function(pageNum, config) {
  						config.data = {"streetId":$("#street").val(),"qymc":$("#qymc").val(),"shxydm":$("#shxydm").val()};
  						return true;
  					},
  					"beforeSearch" : function(config) {
  						config.data = {"streetId":$("#street").val(),"qymc":$("#qymc").val(),"shxydm":$("#shxydm").val()};
  						return true;
  					},
  					"render" : "rend_tab"
  				};
  				Pager.init(config);

  </script>
</html>

这样算是可以跑通了,但是这样实现的分页和排序,性能会降低很多。如果可以直接使用order by,就不需要使用这种方法。



版权声明:本文为m0_46303949原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。