分页和统计查询

发表时间:2017-05-17 17:29:39 浏览量( 39 ) 留言数( 0 )

学习目标:

1、理解hql的统计查询

2、理解hql的分页查询


学习过程:

分页算法以前对我们来说比较难,尤其是不同数据的分页算法也不同,比较麻烦,但是hibernate对分页进行了封装,使用hibernate的分页只需要设置两个函数的值就可以了,而且hibernate还可以根据不同的方言转换成为不同数据库的分页算法。

一、hibernate的分页查询的方法

hibernate的分页非常简单,只需要设置下面两个方法的值就可以了。

query.setFirstResult(0);// 开始位置

query.setMaxResults(10);//每页显示的数量

完成代码如下:

public class Run7 {
	public static void main(String[] args) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();

		// 开启一个事务
		session.beginTransaction();

		String hql = "select p from Post p ";
		Query query = session.createQuery(hql);

		query.setFirstResult(0);// 开始位置
		query.setMaxResults(2);

		List<Post> posts = query.list();

		for (Post post : posts) {
			System.out.println(post.getPostName());
		}

		// 提交事物
		session.getTransaction().commit();
		session.close();

		HibernateUtil.getSessionFactory().close();
	}
}

二、统计函数

在分页的时候我们常常想获得总页数,查询结果总数这些信息,要获得这些信息就必须结合统计函数了,hibernate统计函数和sql语言差不多,也支持count,max,min,sum等等函数。比如要统计员工数量,代码如下:

public class Run6 {
	public static void main(String[] args) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();

		// 开启一个事务
		session.beginTransaction();

	    String hql = "select count(e) from Employee e";
        Query query = session.createQuery(hql);
        Long result = (Long) query.uniqueResult();
        
        System.out.println(result);

		// 提交事物
		session.getTransaction().commit();
		session.close();

		HibernateUtil.getSessionFactory().close();
	}
}

三、封装Page实现完成的分页查询

为了更好的获得分页信息,我们可以使用我们以前封装分页类Page,然后在执行分页查询。

Page类代码如下:

public class Page {
	
	private int itemCount;//总条数
	private int pageCount;//总页数
	private int pageSize;//每页显示条数
	private int currentPage;//当前页
	private int itemStart;//开始位
	private int itemEnd;//结束位
	
	
	public Page(){
		currentPage=1;
		pageSize=10;
	}

	public int getItemCount() {
		return itemCount;
	}

	public void setItemCount(int itemCount) {
		this.itemCount = itemCount;
	}


	public int getPageSize() {
		return pageSize;
	}


	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}


	public int getCurrentPage() {
		return currentPage;
	}


	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}


	public int getItemStart() {
		return (currentPage-1)*pageSize;
	}


	public int getItemEnd() {
		return getItemStart()+pageSize;
	}

    //101  10  100/10  总条数/每页显示条数
	public int getPageCount() {
		return itemCount%pageSize==0?itemCount/pageSize:(itemCount/pageSize+1);
	}


}

分页查询

public class Run8 {

	public static List<Post> getPage( Page page) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		// 开启一个事务
		session.beginTransaction();
		String hql2 = "select count(p) from Post p";
		Query query2 = session.createQuery(hql2);
		Long result = (Long) query2.uniqueResult();

		page.setItemCount(result.intValue());

		String hql = "select p from Post p ";
		Query query = session.createQuery(hql);

		query.setFirstResult(page.getItemStart());// 开始位置
		query.setMaxResults(page.getPageSize());

		List<Post> posts = query.list();

		// 提交事物
		session.getTransaction().commit();
		session.close();

		HibernateUtil.getSessionFactory().close();
		return posts;

	}

	public static void main(String[] args) {
		 Page page =new Page();
		 
		 page.setCurrentPage(1);
		 page.setPageSize(2);

		List<Post> posts = getPage(page);

		for (Post post : posts) {
			System.out.println(post.getPostName());
		}

		System.out.println(page.getPageCount()+":"+page.getItemCount());
	
	}
}