`
arthas1982
  • 浏览: 3424 次
  • 性别: Icon_minigender_1
  • 来自: 火星蛤蟆王国
最近访客 更多访客>>
社区版块
存档分类
最新评论

懒人的分页实现(基于Hibernate)

阅读更多
前几天做页面,发现有大量的分页查询页面要做,而且都是基于单表的,一开始想,用Criteria的example查询轻松啊,可是实现的时候遇到一个问题,花了一上午没搞定,再加之项目进度比较急,就想着用反射来取查询VO里得值来拼装HQL,忙乎了2个小时,做出个雏形暂时先用着,今天回头看到这个实现,感到还有一些地方可以改进,先把最初版本放上来,作为一个留念,也暂且作为我的JAVAEYE的懒人BLOG的开粪堆之做吧。

所有QueryVO继承BaseVO
public abstract class BaseVO {
	public static final String ASC = "asc";
	public static final String DESC = "desc";
	private int pageNo = 1;
	private String pageOrder = DESC;
	private boolean fuzzyQuery = true;
	private int resultsPerPage = Constants.PAGE_SIZE;
	private int pagePerGroup = Constants.PAGE_GROUP_SIZE;
	private String orderBy = "id";

        public String getOrderBy() {
		return orderBy;
	}

	public void setOrderBy(String orderBy) {
		this.orderBy = orderBy;
	}
        ....


public class User extends BaseVO implements java.io.Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -8138345689576402414L;

	private Integer id;

	private String username;

	private String password;

	private String email;

	private String address;

	private String zip;

	private String mobilenum;

	private String tel;

        ......


DAO实现
public class BaseDAO extends HibernateDaoSupport {
	@SuppressWarnings( { "static-access", "unchecked" })
	public Page findPageByEntityQuery(final BaseVO entity) throws Exception {
		final int pageNo = entity.getPageNo();
		final int maxResults = entity.getResultsPerPage();
		final int pagePerGroup = entity.getPagePerGroup();

		HQLFittingShop hQLFittingShop = HQLFittingShop.getInstance(entity);

		final String _finalHql = hQLFittingShop.getHql();
		final String _finalCountHql = hQLFittingShop.getCounthql();
		final Object[] _finalValues = hQLFittingShop.getPram();

		Page resultPage = (Page) getHibernateTemplate().execute(
				(new HibernateCallback() {
					public Object doInHibernate(Session session) {
						final String finalHql = _finalHql;
						final String finalCountHql = _finalCountHql;
						final Object[] finalValues = _finalValues;
						Query query = session.createQuery(finalHql);
						Query countQuery = session.createQuery(finalCountHql);
						for (int i = 0; i < finalValues.length; i++) {
							Object tempVal = finalValues[i];
							query.setParameter(i, tempVal);
							countQuery.setParameter(i, tempVal);
						}
						int totalRecord = 0;
						totalRecord = ((Integer) countQuery.uniqueResult())
								.intValue();
						Pager pager = new QueryPager(query);
						return pager.getPage(maxResults, pageNo, pagePerGroup,
								totalRecord);

					}
				}));
		return resultPage;
	}
}
}


HQLFittingShop实现
public class HQLFittingShop {
	private final String hql;

	private final Object[] pram;

	private final String counthql;

	protected HQLFittingShop(final String finalHql, final Object[] finalPram,
			final String finalCountHql) {
		super();
		this.hql = finalHql;
		this.pram = finalPram;
		this.counthql = finalCountHql;
	}

	@SuppressWarnings( { "static-access", "unchecked" })
	public static HQLFittingShop getInstance(BaseVO entity)
			throws IllegalAccessException, InvocationTargetException,
			NoSuchMethodException, InstantiationException,
			ClassNotFoundException {
		String pageOrder = entity.getPageOrder();
		String orderBy = entity.getOrderBy();
		boolean fuzzyQuery = entity.isFuzzyQuery();
		String hql = "from " + entity.getClass().getName() + " a where 1=1 ";
		List valueList = new ArrayList();
		PropertyUtils pu = new PropertyUtils();
		PropertyDescriptor[] pd = pu.getPropertyDescriptors(entity.getClass());
		BeanUtils bu = new BeanUtils();
		PropertyUtils superpu = new PropertyUtils();
		PropertyDescriptor[] superpd = superpu
				.getPropertyDescriptors(BaseVO.class);

		for (int i = 0; i < pd.length; i++) {
			if (bu.getProperty(entity, pd[i].getName()) != null) {
				boolean hasThisProprty = false;
				for (int j = 0; j < superpd.length; j++) {
					if (superpd[j].getName().equals(pd[i].getName())) {
						hasThisProprty = true;
						break;
					}
				}
				if (!hasThisProprty) {
					if (fuzzyQuery
							&& "java.lang.String".equals(pd[i]
									.getPropertyType().getName())) {
						hql += "and a." + pd[i].getName() + " like ? ";
						valueList.add("%"
								+ bu.getProperty(entity, pd[i].getName())
										.trim() + "%");
					} else {
						if (!("id".equals(pd[i].getName()) && "0".equals(bu
								.getProperty(entity, pd[i].getName())))) {
							hql += "and a." + pd[i].getName() + " = ? ";
							Object obj = ConstructorUtils.invokeConstructor(
									Class.forName(pd[i].getPropertyType()
											.getName()), bu.getProperty(entity,
											pd[i].getName()));
							valueList.add(obj);
						}
					}
				}
			}
		}

		hql += "order by a." + orderBy + " " + pageOrder;

		Object[] values = new Object[valueList.size()];
		for (int j = 0; j < values.length; j++) {
			values[j] = valueList.get(j);
		}

		final String finalHql = hql;
		final Object[] finalPram = values;
		return new HQLFittingShop(finalHql, finalPram, "select count(a.id) "
				+ hql);
	}

	public String getHql() {
		return hql;
	}

	public Object[] getPram() {
		return pram;
	}

	public String getCounthql() {
		return counthql;
	}

}


Pager实现
public class QueryPager implements Pager {

	private final Query query;

	public QueryPager(final Query query) {
		this.query = query;
	}

	public Page getPage(final int maxResults, final int pageNumber, final int pagePerGroup,final int totalPageNumber) throws HibernateException {
		query.setFirstResult((pageNumber-1)*maxResults);
		query.setMaxResults(maxResults);
		List results = query.list();
		Page pageImpl = new PageImpl(results, pageNumber, maxResults,pagePerGroup,totalPageNumber);
		return pageImpl;

	}

}



Page实现
public class PageImpl implements Page {

	private final List results;
	private final int pageNumber;
	private final int groupNumber;
	private final int resultsPerPage;
	@Deprecated
	private final int pageGroupNumber;
	private final boolean last;
	private final boolean first;
	private final boolean lastGroup;
	private final boolean firstGroup;
	private final int pagePerGroup;
	private final int[] pageGroup;
	private final int lastGroupNumber;
	private final int firstGroupNumber = 1;
	private final int lastGroupPageNumber;
	private final int firstGroupPageNumber = 1;
	private final int lastPageNumber;
	private final int firstPageNumber = 1;
	private final int totalPageNumber;
	private final int totalResultsNumber;
	private final int beforeGroupPageNumber;
	private final int afterGroupPageNumber;
	
	public PageImpl(final List results, final int pageNumber, final int resultsPerPage, final int pagePerGroup,final int totalResultsNumber) {
		super();
		this.results = results;
		this.pageNumber = pageNumber;
		this.resultsPerPage = resultsPerPage;
		this.pageGroupNumber = pagePerGroup;
		this.totalResultsNumber = totalResultsNumber;
		if(0 == totalResultsNumber % resultsPerPage){
			this.totalPageNumber = totalResultsNumber/resultsPerPage;
		}else{
			this.totalPageNumber = totalResultsNumber/resultsPerPage + 1;
		}
		this.pagePerGroup = pagePerGroup;
		if(pageNumber * resultsPerPage >= totalPageNumber){
			this.last = true;
		}else{
			this.last = false;
		}
		if(pageNumber == 1){
			this.first = true;
		}else{
			this.first = false;
		}
		if(pageNumber <= pagePerGroup){
			this.firstGroup = true;
		}else{
			this.firstGroup = false;
		}
		if(0 == totalPageNumber % pagePerGroup){
			this.lastGroupNumber = totalPageNumber/pagePerGroup;
			this.lastGroupPageNumber = lastGroupNumber*pagePerGroup;
		}else{
			this.lastGroupNumber = totalPageNumber/pagePerGroup + 1;
			this.lastGroupPageNumber = (lastGroupNumber-1)*(pagePerGroup) + 1;
		}
		if(0 == pageNumber % pagePerGroup){
			if(pageNumber/pagePerGroup - 1 == lastGroupNumber - 1){
				this.lastGroup = true;
			}else{
				this.lastGroup = false;
			}
		}else{
			if(pageNumber/pagePerGroup == lastGroupNumber - 1){
				this.lastGroup = true;
			}else{
				this.lastGroup = false;
			}
		}
		if(0 == pageNumber % pagePerGroup){
			this.groupNumber = pageNumber/pagePerGroup;
		}else{
			this.groupNumber = pageNumber/pagePerGroup + 1;
		}
		if(lastGroup){
			pageGroup = new int[totalPageNumber % pagePerGroup];
			int allReNo = this.totalPageNumber;
			for(int i=pageGroup.length;i>0;i--){
				pageGroup[i-1] = allReNo--;
			}
		}else{
			pageGroup = new int[pagePerGroup];
			for(int i=0;i<pagePerGroup;i++){
				pageGroup[i] = (groupNumber-1)*pagePerGroup + 1 + i;
			}
		}
		this.lastPageNumber = totalPageNumber;
		if(this.firstGroup){
			this.beforeGroupPageNumber = 1;
		}else{
			this.beforeGroupPageNumber = (this.groupNumber-1)*this.pagePerGroup - (this.pagePerGroup-1);
		}
		if(this.lastGroup){
			this.afterGroupPageNumber = this.lastGroupPageNumber;
		}else{
			this.afterGroupPageNumber = (this.groupNumber+1)*this.pagePerGroup - (this.pagePerGroup-1);
		}
	}
	
	public int getAfterGroupPageNumber() {
		return afterGroupPageNumber;
	}

	public int getBeforeGroupPageNumber() {
		return beforeGroupPageNumber;
	}

	public int getGroupNumber() {
		return groupNumber;
	}

	public int getPagePerGroup() {
		return pagePerGroup;
	}

	public int getTotalResultsNumber() {
		return totalResultsNumber;
	}

	public int getFirstPageNumber() {
		return firstPageNumber;
	}

	public int getLastPageNumber() {
		return lastPageNumber;
	}

	public int getLastGroupPageNumber() {
		return lastGroupPageNumber;
	}

	public int getFirstGroupPageNumber() {
		return firstGroupPageNumber;
	}

	public int[] getPageGroup() {
		return pageGroup;
	}

	public int getResultsPerPage() {
		return resultsPerPage;
	}

	public boolean isFirst() {
		return first;
	}

	public boolean isFirstGroup() {
		return firstGroup;
	}

	public boolean isLast() {
		return last;
	}

	public boolean isLastGroup() {
		return lastGroup;
	}

	public int getPageGroupNumber() {
		return pageGroupNumber;
	}

	public int getPageNumber() {
		return pageNumber;
	}

	public List getResults() {
		return results;
	}

	public int getTotalPageNumber() {
		return totalPageNumber;
	}

	public int getFirstGroupNumber() {
		return firstGroupNumber;
	}

	public int getLastGroupNumber() {
		return lastGroupNumber;
	}
	
}


页面上的处理
		<script language="javascript">
		function initial(init){
		var pageno = document.getElementById('trresearch.pageNo');
		if (pageno) {
			pageno.value = init;
		};
		document.form.submit();
		}
		</script>
		
		<html:hidden property="pageNo"/>
		<html:hidden property="pageOrder"/>
		<html:hidden property="fuzzyQuery"/>
		
<a href="javaScript:initial('1')">第一页</a> 
<a href="javaScript:initial('${page.beforeGroupPageNumber }')">前一组</a> 
                
                
<c:forEach items="${page.pageGroup}" var="pageNo">
<c:if test="${pageNo eq page.pageNumber}">
<span class="当前页">
<a href="javaScript:initial('${pageNo}')">${pageNo}</a>
</span>
</c:if>
<c:if test="${pageNo ne page.pageNumber}">
<a href="javaScript:initial('${pageNo}')">${pageNo}</a>
</c:if>
</c:forEach>
                
<a href="javaScript:initial('${page.afterGroupPageNumber }')">后一组</a> 
<a href="javaScript:initial('${page.lastPageNumber }')">最后页</a>


分享到:
评论

相关推荐

    基于PaddleOCR开发懒人精灵文字识别插件

    基于PaddleOCR开发懒人精灵文字识别插件,使用方式可以查看该文章https://blog.csdn.net/YY007H/article/details/128247582

    30种CSS分页效果经典配色方案源码

    它们主要专注于视觉设计,因此在实际项目中,你可能需要结合JavaScript或者其他前端框架(如jQuery、Vue.js或React.js)来实现分页的逻辑部分。 总的来说,"30种CSS分页效果经典配色方案源码"是一个宝贵的资源库,...

    lua 懒人精灵懒人精灵懒人精灵懒人精灵

    懒人精灵懒人精灵懒人精灵懒人精灵懒人精灵懒人精灵

    最好最好的java万能分页标签

    "page懒人万能分页(梁玉龙版)struts"可能是指该分页组件的一个特定版本,由梁玉龙开发,并针对Struts框架进行了优化。Struts是一个基于MVC设计模式的Java Web框架,它负责处理用户的请求并转发到相应的Action,...

    24款网页分页方法满足网站需要

    5. 懒加载分页:懒人图库.txt可能介绍了一种“懒加载”分页技术,即只加载当前可见页面的内容,当用户滚动到页面底部时再加载下一页。这种方式优化了加载性能,特别适用于大型数据集。 6. 自适应分页:随着移动设备...

    基于springboot大学生智能消费记账系统的设计与实现.docx

    基于springboot大学生智能消费记账系统的设计与实现.docx

    按键精灵的懒人插件12

    6. **图像识别与处理**:在某些场景下,基于图像识别的自动化可能更为实用,懒人插件可能集成了图像识别技术,帮助用户识别和点击屏幕上的图像元素。 7. **文件操作与网络通信**:懒人插件可能增加了对文件系统和...

    懒人图库出品的PSD格式分页样式图V2[2008_01_09更新

    标题中的“懒人图库出品的PSD格式分页样式图V2[2008_01_09更新]”表明这是一个由懒人图库制作并发布的资源包,内容涉及PSD(Photoshop Document)格式的分页样式设计。这里的“V2”代表这是该系列产品的第二个版本,...

    基于微信小程序懒人美食帮小程序设计与实现.docx

    基于微信小程序懒人美食帮小程序设计与实现.docx

    懒人小工具实现电脑维护办公

    作为办公室一族,您是否越来越感觉逐渐成为电脑的奴隶?本人是感觉深受其害,每天面对电脑没完没了,很多时候面对复杂的操作感觉真累。懒人工具箱是一款免费的...我们坚信懒人创造了世界,让懒人摆脱重复性的无谓劳动

    懒人许工具.7z懒人许工具

    "懒人许工具.7z"是一款针对CAD(计算机辅助设计)软件的便捷插件集合,主要用于提升用户在使用CAD时的工作效率。该工具可能包含了多个版本,适用于不同的CAD平台,如2004年至2010年的版本。从压缩包的文件名来看,...

    10种分页代码(网页制作)

    -天堂的生活.url`和`LAYABOUT'S GALLERY 懒人图库.url`,这些链接可能是指向不同分页的静态页面,点击后跳转到新的URL以展示不同内容。这是早期网页分页的常见方法,但可能导致浏览器历史记录过多。 3. **JSpage...

    懒人精灵源码懒人精灵源码懒人精灵源码懒人精灵源码

    【标题】懒人精灵源码 懒人精灵源码是一个重要的软件或插件项目,它可能涉及编程语言、软件工程、自动化工具等多个IT领域的知识点。从"懒人精灵"这个名字可以推测,它可能是为了简化用户操作,提高效率而设计的一款...

    偷懒道具,分页工具

    不跳转页面分页工具,依赖于jQuery,默认样式依赖于bootstrap3.0,通过最大行数和显示 行数计算出分页总数,通过设置的样式结构决定前台展示出现的样式,目前存在两种展出模式,可通过定义扩展方式,增加展出样式。

    基于Pnetlab4.0.2的懒人包.rar

    A light,网盘文件,本人亲测可用,连接永久有效 docker ubuntu. docx Docker Chrome Node. docx PNET 4.0.2 SD-WAN Lab_For- Dummies _By_ Doge. ova ...he docker wireshark.docx Ubuntu Desktop....

    Java项目基于springboot实现的懒人美食帮微信小程序

    基于Spring Boot实现的懒人美食帮微信小程序,旨在为忙碌的现代人提供便捷、快速的美食订餐和美食推荐服务。以下是该小程序的主要功能: 美食浏览与搜索:用户可以在小程序中浏览各类美食,包括餐厅推荐、特色菜品...

    懒人系列1-基于链表的字符串分割功能实现

    本系列为懒人版工具箱,注解丰富,逻辑清晰,移植方便,便于学习和使用,初次上手请参考示例代码。

    【新版】懒人办公插件V15.0106.0.11

    在懒人办公插件中,LazyOffice.dll提供了插件的所有功能实现,当用户在Excel、Word或ET表格中调用插件时,系统会加载这个DLL文件来执行相应的命令。 总的来说,懒人办公插件V15.0106.0.11通过COM接口实现了与主流...

    Android-个人作品模仿的懒人天气实现国内地级市的天气查询

    个人作品,模仿的懒人天气,实现国内地级市的天气查询

Global site tag (gtag.js) - Google Analytics