• 分页和多条件查询功能


    /**
     * 辅助拼接HQL声明工具
     * @author G-Xia
     *
     */
    public class QueryHelper {
    
    	private String fromClause; // From子句
    	private String whereClause = ""; // Where子句
    	private String orderByClause = ""; // OrderBy子句
    
    	private List<Object> parameters = new ArrayList<Object>(); // 參数列表
    
    	/**
    	 * 生成From子句
    	 * 
    	 * @param clazz
    	 * @param alias
    	 *            别名
    	 */
    	public QueryHelper(Class clazz, String alias) {
    		fromClause = "FROM " + clazz.getSimpleName() + " " + alias;
    	}
    
    	/**
    	 * 拼接Where子句
    	 * 
    	 * @param condition
    	 * @param args
    	 */
    	public QueryHelper addWhereCondition(String condition, Object... args) {
    		// 拼接
    		if (whereClause.length() == 0) {
    			whereClause = " WHERE " + condition;
    		} else {
    			whereClause += " AND " + condition;
    		}
    		// 处理參数
    		if (args != null && args.length > 0) {
    			for (Object arg : args) {
    				parameters.add(arg);
    			}
    		}
    		return this;
    	}
    
    	/**
    	 * 假设第一个參数的值为true,就拼接Where子句
    	 * 
    	 * @param append
    	 * @param condition
    	 * @param args
    	 */
    	public QueryHelper addWhereCondition(boolean append, String condition, Object... args) {
    		if (append) {
    			addWhereCondition(condition, args);
    		}
    		return this;
    	}
    
    	/**
    	 * 拼接OrderBy子句
    	 * 
    	 * @param propertyName
    	 * @param asc
    	 *            true表示升序,false表示降序
    	 */
    	public QueryHelper addOrderByProperty(String propertyName, boolean asc) {
    		if (orderByClause.length() == 0) {
    			orderByClause = " ORDER BY " + propertyName + (asc ? " ASC" : " DESC");
    		} else {
    			orderByClause += ", " + propertyName + (asc ?

    " ASC" : " DESC"); } return this; } /** * 假设第一个參数的值为true,就拼接OrderBy子句 * * @param append * @param propertyName * @param asc */ public QueryHelper addOrderByProperty(boolean append, String propertyName, boolean asc) { if (append) { addOrderByProperty(propertyName, asc); } return this; } /** * 获取查询数据列表的HQL语句 * * @return */ public String getQueryListHql() { return fromClause + whereClause + orderByClause; } /** * 获取查询总记录数的HQL语句(没有OrderBy子句) * * @return */ public String getQueryCountHql() { return "SELECT COUNT(*) " + fromClause + whereClause; } /** * 获取參数列表 * * @return */ public List<Object> getParameters() { return parameters; } /** * 准备PageBean对象到Struts2的栈顶 * @param service * @param pageNum */ public void preparePageBean(DaoSupport<?> service, int pageNum){ PageBean pageBean = service.getPageBean(pageNum, this); ActionContext.getContext().getValueStack().push(pageBean); } }

    PageBean:分页用的页面信息

    public class PageBean {
    
    	// 传递的參数或配置的值
    	private int currentPage; // 当前页
    	private int pageSize; // 每页显示的记录数
    
    	// 查询数据库
    	private int recordCount; // 总记录数
    	private List recordList; // 本页的数据列表
    
    	// 计算出来的
    	private int pageCount; // 总页数
    	private int beginPageIndex; // 页面列表的開始索引
    	private int endPageIndex; // 页面列表的结束索引
    
    	/**
    	 * 仅仅接受前4个必要的属性的值,会自己主动的计算出后3个属性的值
    	 * 
    	 * @param currentPage
    	 * @param pageSize
    	 * @param recordCount
    	 * @param recordList
    	 */
    	public PageBean(int currentPage, int pageSize, int recordCount, List recordList) {
    		this.currentPage = currentPage;
    		this.pageSize = pageSize;
    		this.recordCount = recordCount;
    		this.recordList = recordList;
    
    		// 计算pageCount
    		pageCount = (recordCount + pageSize - 1) / pageSize;
    
    		// 计算begPageIndex和endPageIndex
    		// a, 总页数不超过10页,就所有显示
    		if (pageCount <= 10) {
    			beginPageIndex = 1;
    			endPageIndex = pageCount;
    		}
    		// b, 总页数超过了10页,就显示当前页附近的共10个页码(前4个 + 当前页 + 后5个)
    		else {
    			// 显示当前页附近的共10个页码(前4个 + 当前页 + 后5个)
    			beginPageIndex = currentPage - 4; // 7 - 4 = 3
    			endPageIndex = currentPage + 5; // 7 + 5 = 12
    			// 当前面不足4个页码时,就显示前10页
    			if (beginPageIndex < 1) {
    				beginPageIndex = 1;
    				endPageIndex = 10;
    			}
    			// 当后面不足5个页码时。就显示后10页
    			else if (endPageIndex > pageCount) {
    				endPageIndex = pageCount;
    				beginPageIndex = pageCount - 10 + 1; // 注意在显示的时候是包括两个边界的
    			}
    		}
    	}
    
    	public int getCurrentPage() {
    		return currentPage;
    	}
    
    	public void setCurrentPage(int currentPage) {
    		this.currentPage = currentPage;
    	}
    
    	public int getPageCount() {
    		return pageCount;
    	}
    
    	public void setPageCount(int pageCount) {
    		this.pageCount = pageCount;
    	}
    
    	public int getPageSize() {
    		return pageSize;
    	}
    
    	public void setPageSize(int pageSize) {
    		this.pageSize = pageSize;
    	}
    
    	public int getRecordCount() {
    		return recordCount;
    	}
    
    	public void setRecordCount(int recordCount) {
    		this.recordCount = recordCount;
    	}
    
    	public List getRecordList() {
    		return recordList;
    	}
    
    	public void setRecordList(List recordList) {
    		this.recordList = recordList;
    	}
    
    	public int getBeginPageIndex() {
    		return beginPageIndex;
    	}
    
    	public void setBeginPageIndex(int beginPageIndex) {
    		this.beginPageIndex = beginPageIndex;
    	}
    
    	public int getEndPageIndex() {
    		return endPageIndex;
    	}
    
    	public void setEndPageIndex(int endPageIndex) {
    		this.endPageIndex = endPageIndex;
    	}
    
    }
    


    /**
    	 * 公共的查询分页信息的方法(终于版)
    	 * 
    	 * @param pageNum
    	 * @param queryHelper
    	 *            查询语句 + 參数列表
    	 * @return
    	 */
    	public PageBean getPageBean(int pageNum, QueryHelper queryHelper) {
    		System.out.println("------------> DaoSupportImpl.getPageBean( int pageNum, QueryHelper queryHelper )");
    
    		// 获取pageSize等信息
    		int pageSize = Configuration.getPageSize();
    		List<Object> parameters = queryHelper.getParameters();
    
    		// 查询一页的数据列表
    		Query query = getSession().createQuery(queryHelper.getQueryListHql());
    		if (parameters != null && parameters.size() > 0) { // 设置參数
    			for (int i = 0; i < parameters.size(); i++) {
    				query.setParameter(i, parameters.get(i));
    			}
    		}
    		query.setFirstResult((pageNum - 1) * pageSize);
    		query.setMaxResults(pageSize);
    		List list = query.list(); // 查询
    
    		// 查询总记录数
    		query = getSession().createQuery(queryHelper.getQueryCountHql()); // 注意空格。
    		if (parameters != null && parameters.size() > 0) { // 设置參数
    			for (int i = 0; i < parameters.size(); i++) {
    				query.setParameter(i, parameters.get(i));
    			}
    		}
    		Long count = (Long) query.uniqueResult(); // 查询
    
    		return new PageBean(pageNum, pageSize, count.intValue(), list);
    	}
    

    // 准备分页的数据 -- 使用QueryHelper
    		new QueryHelper(Topic.class, "t")//
    				.addWhereCondition("t.forum=?", forum)//
    				.addWhereCondition((viewType == 1), "t.type=?", Topic.TYPE_BEST) // 1 表示仅仅看精华帖
    				.addOrderByProperty((orderBy == 1), "t.lastUpdateTime", asc) // 1 表示仅仅按最后更新时间排序
    				.addOrderByProperty((orderBy == 2), "t.postTime", asc) // 表示仅仅按主题发表时间排序
    				.addOrderByProperty((orderBy == 3), "t.replyCount", asc) // 表示仅仅按回复数量排序
    				.addOrderByProperty((orderBy == 0), "(CASE t.type WHEN 2 THEN 2 ELSE 0 END)", false)//
    				.addOrderByProperty((orderBy == 0), "t.lastUpdateTime", false) // 0 表示默认排序(全部置顶帖在前面。并按最后更新时间降序排列)
    				.preparePageBean(topicService, pageNum);

    JSP中页面信息

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    
    <%-- 分页信息 --%>
    <div id=PageSelectorBar>
    	<div id=PageSelectorMemo>
    		页次:${currentPage}/${pageCount }页  
    		每页显示:${pageSize }条  
    		总记录数:${recordCount }条
    	</div>
    	<div id=PageSelectorSelectorArea>
    
    		<a href="javascript: gotoPage(1)" title="首页" style="cursor: hand;">
    			<img src="${pageContext.request.contextPath}/style/blue/images/pageSelector/firstPage.png"/>
    		</a>
    		
    		<%-- 页码列表 --%>
    		<s:iterator begin="%{beginPageIndex}" end="%{endPageIndex}" var="num">
    			<s:if test=" #num != currentPage "><%-- 非当前页,有链接 --%>
    				<span class="PageSelectorNum" style="cursor: hand;" onClick="gotoPage(${num});">${num}</span>
    			</s:if>
    			<s:else><%-- 当前页,没有链接 --%>
    				<span class="PageSelectorNum PageSelectorSelected">${num}</span>
    			</s:else>
    		</s:iterator>
    
    		<a href="javascript: gotoPage(${pageCount})" title="尾页" style="cursor: hand;">
    			<img src="${pageContext.request.contextPath}/style/blue/images/pageSelector/lastPage.png"/>
    		</a>
    		
    		转到:
    		<select id="pn" onchange="gotoPage( this.value )">
    			<s:iterator begin="1" end="%{pageCount}" var="num">
    				<option value="${num}">${num}</option>
    			</s:iterator>
    		</select>
    		
    		<%-- 让select默认选中当前页 --%>
    		<script type="text/javascript">
    			$("#pn").val( "${currentPage}" );
    		</script>
    		
    	</div>
    </div>
    
    <script type="text/javascript">
    	/**
    	 * 转到指定的页码
    	 * @param {Object} pageNum
    	 */
    	function gotoPage( pageNum ){
    		// 方式一: 
    		// window.location.href = "forum_show.do?

    id=${id}&pageNum=" + pageNum; // alert("请实现gotoPage()方法!"); // 方式二: $("#pageForm").append("<input type='hidden' name='pageNum' value='" + pageNum + "'>"); // 加入pageNum表单字段 $("#pageForm").submit(); // 提交表单 } </script>




    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    数组常用操作实现
    链表简单实现栈与队列
    亿万级别的表数据处理方式
    ubuntu安装与卸载.dep软件
    pg数据库表接口和数据导出
    深入分析理解Tomcat体系结构
    Servlet源码级别进行详解
    Maven命令行创建java或javaWeb项目
    解释语言与编译语言
    C++中Reference与Pointer的不同
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4672372.html
Copyright © 2020-2023  润新知