今天遇到一个问题,实体类中的一个字段数据会变化,所以不存到数据库中,也不能用”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 版权协议,转载请附上原文出处链接和本声明。