`
jeffenchung
  • 浏览: 11881 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于Hibernate分页类和jdbc的sql分页完美融合

阅读更多
1.先来看这两个核心兄弟方法。
/**
	 * 分页查询函数
	 * 
	 * @param hql
	 * @param pageNo
	 *            页号,从1开始
	 * @param pageSize
	 *            每页尺寸
	 * @param values
	 * @return 总记录数和当前页数据的Page对象。
	 */
	@SuppressWarnings("unchecked")
	public Page superPagedQuery(String hql, int pageNo, int pageSize,
			Object... values) {
		Page page = null;
		try {
			Session session = this.getSession(false);
			// Count查询
			String countQueryString = " select count (*) "
					+ removeSelect(removeOrders(hql));
			List countlist = this.find(session, countQueryString, values);
			int totalCount = 0;
			Object obj = countlist.get(0);
			if (obj instanceof String) {
				totalCount = Integer.parseInt((String) obj);
			}
			if (obj instanceof Integer) {
				totalCount = (Integer) obj;
			}
			if (obj instanceof Long) {
				totalCount = Integer.parseInt("" + obj);
			}

			if (totalCount < 1)
				return new Page();
			// 实际查询返回分页对象
			int startIndex = Page.getStartOfPage(pageNo, pageSize);
			Query query = createQuery(session, hql, values);
			// 新加入设置查询缓存
			query.setCacheable(false);
			List list = null;

			list = query.setFirstResult(startIndex).setMaxResults(pageSize)
					.list();

			page = new Page(startIndex, totalCount, pageSize, list);

		} catch (Exception e) {
			e.printStackTrace();
		}

		return page;
	}

	/**
	 * 分页查询函数(Oracle Sql)
	 * 
	 * @param hql
	 * @param pageNo
	 *            页号,从1开始
	 * @param pageSize
	 *            每页尺寸
	 * @param values
	 * @return 总记录数和当前页数据的Page对象。
	 */
	@SuppressWarnings("unchecked")
	public Page superSqlPagedQuery(String sql, int pageNo, int pageSize,
			Object... values) {
		if (log.isDebugEnabled()) {
			log.debug("superSqlPagedQuery() start...");
		}
		Page page = null;
		try {
			// Count查询
			String countQueryString = " select count(0) as cnt "
					+ removeSelect(removeOrders(sql));
			if(log.isInfoEnabled()){
				log.info("countQueryString:"+countQueryString);
			}
			List countlist = this.jdbcTemplate.queryForList(countQueryString,
					values);
			int totalCount = 0;
			Object obj = countlist.get(0);
			if (obj instanceof String) {
				totalCount = Integer.parseInt((String) obj);
			}
			if (obj instanceof Integer) {
				totalCount = (Integer) obj;
			}
			if (obj instanceof Long) {
				totalCount = Integer.parseInt("" + obj);
			}
			if (obj instanceof Map) {
				totalCount = Integer.parseInt("" + ((Map)obj).get("cnt"));
			}

			if (totalCount < 1)
				return new Page();
			// 实际查询返回分页对象
			int startIndex = Page.getStartOfPage(pageNo, pageSize);
			String sqlQueryString = createSqlQuery("ora", sql, startIndex,
					startIndex + pageSize);
			if(log.isInfoEnabled()){
				log.info("sqlQueryString:"+sqlQueryString);
			}
			List list = this.jdbcTemplate.queryForList(sqlQueryString, values);
			page = new Page(startIndex, totalCount, pageSize, list);

		} catch (Exception e) {
			e.printStackTrace();
		}

		if (log.isDebugEnabled()) {
			log.debug("superSqlPagedQuery() end");
		}
		return page;
	}


2.再看他们的辅助方法。
/**
	 * 创建查询脚本
	 * 
	 * @param session
	 * @param hql
	 * @param values
	 * @return
	 */
	public Query createQuery(Session session, String hql, Object... values) {
		Query query = session.createQuery(hql);
		for (int i = 0; i < values.length; i++) {
			query.setParameter(i, values[i]);
		}
		return query;
	}

	/**
	 * 创建查询脚本(Sql)
	 * 
	 * 
	 * @param type
	 *            ora: oracle <br/>
	 *            mss: microsoft sql server <br/>
	 *            mys: my sql <br/>
	 *            db2: ibm db2<br/>
	 * @param sql
	 * @param pageStart
	 * @param pageEnd
	 * @return
	 */
	public String createSqlQuery(String type, String sql, int pageStart,
			int pageEnd) {

		if ("ora".equals(type)) {
			sql = "select * from (select pTable_.*, rownum rNum_ from (" + sql
					+ ") pTable_ where rownum<=" + pageEnd + ") where rNum_>="
					+ pageStart;
		} else if ("mss".equals(type)) {

		} else if ("mys".equals(type)) {

		} else if ("db2".equals(type)) {
			sql = "select * from (select *, rownumber() ROW_NEXT from (" + sql
					+ ") where ROW_NEXT between " + pageStart + " and "
					+ pageEnd;
		}
		return sql;
	}


3.奉献两个共同方法
/**
	 * 去除hql中的order by语句
	 * 
	 * @param hql
	 * @return
	 */
	private static String removeOrders(String hql) {
		Pattern p = Pattern.compile("order\\s*by[\\w|\\W|\\s|\\S]*",
				Pattern.CASE_INSENSITIVE);
		Matcher m = p.matcher(hql);
		StringBuffer sb = new StringBuffer();
		while (m.find()) {
			m.appendReplacement(sb, "");
		}
		m.appendTail(sb);
		return sb.toString();
	}

	private static String removeSelect(final String hql) {
		final int beginPos = hql.toLowerCase().indexOf("from");
		return hql.substring(beginPos);
	}


4.以上方法都包装在了SuperHibernateEntityDao.java中,可看附件。

5.关于Page对象类可查看附件Page.java。
当然,里面没用的业务处理对象及方法都可以删掉。
分享到:
评论

相关推荐

    在JDBC,hibernate中实现分页

    本文将深入探讨如何在Java开发环境中使用Hibernate框架以及JDBC结合SQL Server 2005来实现数据分页功能。 #### Hibernate中的分页实现 在Hibernate框架中实现分页功能相对较为简单。通过`Query`对象提供的方法即可...

    Hibernate分页查询原理解读

    #### 三、Hibernate分页查询实现原理 ##### 3.1 使用SQL LIMIT实现分页 对于支持LIMIT关键字的数据库(例如MySQL),Hibernate会通过特定的方言(Dialect)来生成包含LIMIT关键字的SQL语句。具体实现如下: ```...

    oracle-jdbc分页实现(只需传入sql语句即可实现分页)

    但了解底层的SQL分页机制有助于理解框架的工作原理,也能在必要时进行优化。 在提供的"demo2"文件中,可能包含了一个已经封装好的Oracle JDBC分页实现,你可以查阅这个示例代码,了解具体的实现方式。该示例可能是...

    分页 jar包,jdbc ,hibernate(sql语句分页)

    基于sql语句的分页,效率更高,此jar包包含常用分页格式 使用方法在jboss5的博客中

    完整Struts2 HIBERNATE实现分页

    根据提供的标题、描述以及部分内文,我们可以梳理出关于如何使用Struts2与Hibernate实现分页功能的关键知识点。 ### Struts2与Hibernate简介 - **Struts2**:这是一个基于MVC架构的开源Web框架,它能帮助开发者...

    jdbc实现分页功能

    总的来说,JDBC与MySQL结合使用可以方便地实现分页功能,为用户提供了更好的浏览体验,同时也提高了系统的性能。在实际开发中,还可以考虑使用ORM框架如Hibernate或MyBatis,它们提供了更高级的分页支持,使代码更加...

    基于spring+hibernate的组合查询+分页组件

    本篇文章将深入探讨如何结合Spring与Hibernate实现高效、灵活的组合查询以及分页功能,这对于提升Web应用程序的性能和用户体验至关重要。 首先,Spring框架是一个全面的Java企业级应用开发框架,它提供了依赖注入...

    Hibernate中的query 分页.doc

    本文将探讨Hibernate中两种主要的分页方式:`query.scroll()`和使用`query.setFirstResult(), query.setMaxResults()`。 首先,`query.scroll()`方法基于JDBC 2.0的可滚动结果集实现。这种方式允许应用程序在结果...

    JAVA_JDBC面向对象分页(初步设计二之oracle)

    在编写SQL语句时,我们可以结合ROWNUM和子查询来实现分页: ```sql SELECT * FROM ( SELECT ROWNUM AS row_num, t.* FROM YourTable t ) WHERE row_num BETWEEN (pageNumber - 1) * pageSize + 1 AND pageNumber ...

    Oracle的SQL分页实践

    使用JDBC时,可以结合LIMIT和OFFSET子句(Oracle不支持LIMIT,但可以通过ROWNUM模拟)来实现分页,而在Hibernate中,可以使用Criteria API或HQL的`setFirstResult`和`setMaxResults`方法来实现相同的功能。...

    com.microsoft.sqlserver.jdbc.SQLServerException: 只进结果集不支持请求的操作 解决方案

    本文将深入探讨标题和描述中提到的“com.microsoft.sqlserver.jdbc.SQLServerException: 只进结果集不支持请求的操作”这一异常,以及如何在使用Hibernate、Struts进行分页时避免这一问题。我们将从异常的根本原因...

    jsp分页JDBC实现

    总的来说,JDBC实现的JSP分页是一种实用的技术,尤其在没有使用ORM框架如Hibernate的情况下。虽然不如ORM框架那样便捷,但理解这种基础方法有助于深入理解数据访问层的工作原理,为日后的开发打下坚实的基础。

    hibernate的分页查询

    对于不支持分页SQL的数据库,比如某些JDBC版本较低或不完全兼容JDBC2.0的数据库,Hibernate会使用`ResultSet`的滚动功能(scrollable result sets)来实现分页。如果`hibernate.jdbc.use_scrollable_resultset`配置...

    jdbc分页代码使用的是sql语句

    在数据库操作中,分页是一种常见的功能,用于在大量数据中进行有组织的...以上就是使用JDBC和SQL语句实现分页查询的基本步骤和注意事项。在处理大量数据时,分页不仅提高了用户体验,也是服务器资源管理的重要手段。

    SpringMVC+JDBC:分页示例

    在这里,我们将深入探讨如何结合SpringMVC和JDBC实现一个分页示例。 首先,让我们了解SpringMVC中的核心概念。SpringMVC通过DispatcherServlet接收HTTP请求,然后根据配置的映射规则转发到相应的控制器(Controller...

    java简单分页技术mysql 内涵.sql文件,直接实现

    在Java中,使用JDBC进行分页查询时,我们需要构造对应的SQL语句,并在程序中计算`LIMIT`和`OFFSET`的值。以下是一个简单的示例: ```java String sql = "SELECT * FROM table LIMIT ? OFFSET ?"; PreparedStatement...

    Struts+Hibernate+分页

    Struts、Hibernate以及分页是Java Web开发中的关键技术和概念,它们构成了许多企业级应用的基础。下面将详细解析这三个主题,并结合给定的描述进行深入探讨。 首先,Struts是Apache软件基金会的一个开源项目,它是...

    Struts hibernate下的分页代码

    本文将详细介绍如何在Struts和Hibernate框架下实现分页功能,并对提供的类`Page`进行深入分析。 #### 二、Struts与Hibernate简介 1. **Struts框架**:Struts是一个基于MVC(Model-View-Controller)设计模式的开源...

Global site tag (gtag.js) - Google Analytics