`

Hibernate的分页查询 PageObject完整版

 
阅读更多
package com.google.util;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 * 定义一个处理分页查询的类
 * @author Administrator
 *
 */
public class PageObject {

	private int totalRecord = 0;//总记录数
	private int pageSize = 10;//一页显示的条数
	private int currentPage = 1;//当前页
	private int totalPage = 1;//总页数
	private String hql; //执行查询的语句
	private ArrayList params; //hql参数
	private List result; //返回结果集
	
	//创建构造器
	public PageObject(){
		
	}
	/**
	 * 固定类的分页  from ClassPO
	 * @param hql 查询语句
	 * @param param  查询参数
	 * @param pageSize 每页的条数
	 * @param currentPage 当前页
	 */
	public PageObject(String hql, ArrayList params, int pageSize, int currentPage){
		if(currentPage <=0 ){
			this.currentPage = 1;
		}else{
			this.currentPage = currentPage;
		}
		if(pageSize <= 0){
			this.pageSize = 10;
		}else{
			this.pageSize = pageSize;
		}
		this.hql = hql;
		this.params = params;
		getCount();
		result();
	}
	public int getTotalRecord() {
		return totalRecord;
	}
	public int getPageSize() {
		return pageSize;
	}

	public int getCurrentPage() {
		return currentPage;
	}

	public int getTotalPage() {
		return totalPage;
	}

	public ArrayList getParams() {
		return params;
	}
	public void setParams(ArrayList params) {
		this.params = params;
	}
	
	public List getResult() {
		return result;
	}
	public void setResult(List result) {
		this.result = result;
	}
	/**
	 * 获取条数信息
	 */
	public void getCount(){
		Session session = null;
		List list = null;
		try {
			session = HibernateUtil.openSession();
			if(session == null){
				System.out.println("--------------------------");
			}
			String str = new String();
			str = "select count(*) ";
			//判断hql是不是select or SELECT开始的
			if(hql.toLowerCase().trim().indexOf("select") == 0){
				//如果是select 语句开始的,则在str中添加select count(*) from( hql )
				//获取from开始的字串
				str += hql.substring(hql.toLowerCase().indexOf("from"));
				System.out.println("是select 开始的hql "+ str);
			}else{
				//如果是一个PO from CPO,则只是添加select count(*) 即可
				str += hql;
				System.out.println("不是select 开始的hql "+ str);
			}
			System.out.println("====================="+str);
			
			Query query = session.createQuery(str);
			
			query = addParams(query, params);
			
			//设置总记录数
			totalRecord = Integer.parseInt(query.uniqueResult().toString());
//			this.setTotalRecord(Integer.parseInt(query.uniqueResult().toString()));
			//设置总页数
			totalPage = (totalRecord-1)/pageSize+1;
//			this.setTotalPage((totalRecord-1)/pageSize+1);
		} catch (Exception e) {
			throw new RuntimeException("设置页面信息:"+e.getMessage());
		}finally{
			if(session != null && session.isOpen()){
				session.close();
			}
		}
	}
	//执行查询
	public void result(){
		Session session = null;
		Transaction tx = null;
		List list = null;
		try {
			session = HibernateUtil.getCurrentSession();
			tx = session.beginTransaction();
			System.out.println(this.hql);
			Query query = session.createQuery(this.hql);
			
			String str = "select count(*) from (";
			str += this.hql;
			str += ")";
			query = addParams(query, params);

			list = query.setFirstResult((currentPage-1)*pageSize).setMaxResults(pageSize).list();
			this.setResult(list);
			tx.commit();
		} catch (Exception e) {
			if(tx!=null){
				tx.rollback();
			}
			e.printStackTrace();
			throw new RuntimeException("----"+e.getMessage());
		}finally{
			if(session != null && session.isOpen()){
				session.close();
			}
		}
	}
	
	public Query addParams(Query query, ArrayList params){
		//添加参数到hql
		if(params!=null && params.size() >0){
			for(int i=0; i < params.size(); i++){
				query.setParameter(i, params.get(i));
			}
		}
		return query;
	}
}

//附带HibernateUtil.java
package com.google.util;


//import org.hibernate.Session;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;


final public class HibernateUtil {
	
	private static SessionFactory sessionFactory = null;
	private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
	
	public HibernateUtil(){
		
	}
	static{
		sessionFactory = new Configuration().configure().buildSessionFactory();
	}
	//获取全新的session
	public static Session openSession(){
		return sessionFactory.openSession();
	}
	
	//获取和线程关联的session
	public static Session getCurrentSession(){
		
		Session session = threadLocal.get();
		//判断是否得到
		//add by yyy  || !session.isOpen()
		if(session == null || !session.isOpen()){
			session = sessionFactory.openSession();
			//session对象设置到threadLocal -- 相当于session和线程绑定
			threadLocal.set(session);
		}
		return session;
	}
	
	/**
	 * 查询方法
	 */
	public static List executeQuery1(String hql, String[] parameters){
		Session session = null;
		List list = null;
		try {
			session = openSession();
			Query query = session.createQuery(hql);
			if(parameters != null && parameters.length > 0){
				for(int i=0; i< parameters.length; i++){
					query.setParameter(i, parameters[i]);
				}
			}
			list = query.list();
			
		} catch (Exception e) {
			e.getStackTrace();
			throw new RuntimeException(e.getMessage());
		}finally{
			if(session != null && session.isOpen()){
				session.close();
			}
		}
		return list;
	}
	/**
	 * 同意的查询方法:参数使用ArrayList
	 */
	public static List executeQuery(String hql, ArrayList al){
		
		Session session = null;
		List list = null;
		try {
			session = openSession();
			Query query = session.createQuery(hql);
			//注入参数
			if(al!=null && al.size() > 0){
				for(int i=0; i < al.size(); i++){
					query.setParameter(i, al.get(i));
				}
				System.out.println(al.toString());
			}
		//执行查询
			list = query.list();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("Util executeQuery"+e.getMessage());
		}finally{
			if(session != null && session.isOpen()){
				session.close();
			}
		}
		return list;
	}
	
	/**
	 * 同意的分页查询方法 没有确定的PO
	 */
	public static Map executeQueryByPage(String hql, ArrayList parameter, int pageSize, int currentPage){
		
		Session session = null;
		int pageCount = 1;//总页数
		int totalCount = 0;//总记录数
		//pageSize一页显示的条数
		//currentPage 当前页
		List<Object[]> result = null;
		HashMap map = new HashMap();
		try {
			session = openSession();
			Query query = session.createQuery(hql);
			if(parameter != null && parameter.size() > 0){
				for(int i=0; i< parameter.size(); i++){
					query.setParameter(i, parameter.get(i));
				}
			}
			//获取总记录数
			totalCount = query.list().size();
			System.out.println(totalCount);
			//计算总页数
			if(totalCount >=1){
				pageCount = (totalCount-1)/pageSize+1;
			}
			
			//先测试分页情况
		/*	for(int i=1; i<=pageCount; i++){
//				System.out.println("------------第"+i+"页----------------");
				result = query.setFirstResult((i-1)*pageSize).setMaxResults(i*pageSize).list();
			}*/
			/*if(result.size()>0){
				for(int k = 0; k < result.size(); k++){
					Object[] obj = result.get(k);
					for(int j=0; j< obj.length; j++){
						System.out.print(obj[j].toString()+" ");
					}
					System.out.println();
				}
			}*/
			result = query.setFirstResult((currentPage-1)*pageSize).setMaxResults(pageSize).list();
			map.put("TOTAL_COUNT", totalCount);
			map.put("RESULT", result);
			map.put("PAGE_COUNT", pageCount);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return map;
	}
}


分享到:
评论

相关推荐

    Hibernate分页查询小结

    Hibernate分页查询小结

    Hibernate分页查询原理解读

    ### Hibernate 分页查询原理详解 #### 一、引言 在大数据量处理场景下,分页查询是提高数据检索效率的重要手段之一。Hibernate作为Java领域内最常用的持久层框架之一,其内置的分页功能非常实用且高效。本文将深入...

    hibernate分页查询 数据库连接

    本篇将深入探讨Hibernate中的分页查询功能以及它如何处理数据库连接,帮助你更有效地管理大数据量的查询操作。 首先,我们来看一下什么是分页查询。在Web应用中,当用户需要浏览大量数据时,一次性加载所有数据不仅...

    hibernate分页查询

    Hibernate,作为一个流行的Java对象关系映射(ORM)框架,为开发者提供了便捷的分页查询功能。让我们深入探讨Hibernate分页查询的相关知识点。 一、Hibernate分页原理 Hibernate分页查询基于SQL的LIMIT和OFFSET子句...

    使用hibernate分页查询

    以下是如何使用Hibernate进行分页查询的详细说明: 1. **配置Hibernate分页**: 在Hibernate中,我们通常使用`Criteria`或`Query` API进行分页查询。`Criteria`提供了一种更面向对象的方式来执行SQL查询,而`Query...

    hibernate分页查询功能

    本示例中,我们看到如何利用Struts2、Spring和Hibernate这三个流行框架来实现分页查询功能。下面我们将详细讲解这个实现过程。 1. **UserDao接口**: UserDao接口定义了分页查询的方法,通过`getUser(int offset, ...

    STRUTS2+HIBERNATE详细的分页实现代码详细的分页实现代码

    在这个类中,我们可以通过编写Hibernate HQL或SQL查询语句来实现分页查询。 4. **Struts2 Action** 在Action类中,我们需要处理来自用户的请求参数,如当前页码和每页显示记录数等,并调用DAO中的分页查询方法获取...

    Struts和Hibernate分页及查询

    在分页查询中,Hibernate提供了一种称为HQL(Hibernate Query Language)的SQL方言,可以方便地实现复杂的查询,包括分页查询。此外,Hibernate还支持Criteria查询,这是一种更加面向对象的查询方式,同样可以实现...

    Hibernate 分页查询效果

    本篇主要围绕"Hibernate分页查询效果"这一主题,深入探讨如何利用Hibernate框架实现高效、便捷的分页功能。 首先,Hibernate是一个优秀的Java持久化框架,它提供了ORM(对象关系映射)解决方案,使得开发者可以使用...

    hibernate 模糊查询 分页

    接下来,我们讨论分页查询。在处理大量数据时,一次性加载所有结果可能会导致性能问题。因此,通常会采用分页的方式来获取数据。在Hibernate中,我们可以使用`Criteria`或`Query`对象的`setFirstResult()`和`...

    springmvc+hibernate+spring maven案例(包含分页查询)

    这个压缩包提供的案例是这三个框架的整合使用,涵盖了基本的CRUD(创建、读取、更新、删除)操作,并且包含了分页查询的功能。下面将详细讲解这些知识点。 1. **Spring MVC** - Spring MVC是Spring框架的一个模块...

    hibernate实现分页查询

    ### Hibernate 实现分页查询详解 #### 一、引言 在进行数据库操作时,为了提高用户体验和系统性能,分页查询是一项非常重要的技术。Hibernate作为Java领域内一个优秀的对象关系映射(ORM)框架,提供了强大的数据...

    Hibernate 多表连接分页查询示范项目

    总结,"Hibernate 多表连接分页查询示范项目"是一个实用的示例,它展示了如何在实际应用中利用 Hibernate Criteria API 实现复杂查询和分页,对于学习和掌握 Hibernate 的高级特性和数据库操作技巧非常有帮助。...

    用Hibernate实现分页查询.docx

    ### 使用Hibernate实现分页查询 #### 一、分页查询概念及原理 分页查询是一种在数据量较大的情况下,为了提高用户体验和系统性能而采取的一种技术手段。它将查询结果分成若干页显示,用户可以通过翻页操作查看不同...

    Hibernate中分页查询的封装。

    本文将深入探讨如何在Hibernate中进行分页查询的封装,并提供相关的源码和工具使用方法。 首先,我们需要了解Hibernate中的Criteria查询,这是实现分页查询的一种方式。Criteria API允许我们以面向对象的方式构建...

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

    在Hibernate中,我们可以通过设置FirstResult(对应于SQL的LIMIT开始位置)和MaxResults(对应于SQL的LIMIT大小)参数来实现分页查询。 以下是一个简单的示例,展示如何在Spring和Hibernate中实现组合查询和分页: ...

    hibernate分页代码

    本教程将详细讲解如何在Hibernate中实现分页查询,以及如何在MyEclipse集成环境中运行这段代码。 首先,让我们了解什么是分页查询。分页查询是数据库管理中的一个常见需求,特别是在处理大量数据时,为了提高用户...

    struts2+spring+hibernate分页查询

    综上所述,Struts2、Spring和Hibernate的整合使得开发者能够便捷地实现分页查询,从而优化Web应用的性能和用户体验。在实际项目中,需要根据具体需求和业务场景,选择合适的分页策略和实现方式,同时注意性能优化和...

    struts2+spring+hibernate分页显示完整代码

    在`MemberDao`接口中,我们定义了两个关键的方法,一个是用于分页查询,另一个是获取所有记录的数量。这两个方法分别如下: 1. `queryForPage` 方法接受三个参数:HQL(Hibernate Query Language)查询语句、开始...

    spring+hibernate 分页 +mysql

    5. **分页查询**: 在Hibernate的实现中,我们可以使用Criteria API或者HQL(Hibernate Query Language)配合Pageable接口进行分页查询。 6. **返回结果**: 将Page对象转换为前端需要的格式,如包含总页数、当前页...

Global site tag (gtag.js) - Google Analytics