35、分页和统计查询

学习目标:

1、理解hql的统计查询

2、理解hql的分页查询

3、掌握criteria的使用

学习过程:

分页算法以前对我们来说比较难,尤其是不同数据的分页算法也不同,比较麻烦,但是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());
    }
}

四、criteria学习

除了hql外,hibernate提供了更加面向对象的方式查询数据库,就是用criteria。criteria可以使用更加面向对象的方式查询数据库,就算你不会写sql语句也可以实现非常复杂的数据库查询,我们可以通过添加约束的方式就可以实现条件查询了。示例代码如下:

public class Run9 {
    public static List<Employee> getEmps(String empName) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        // 开启一个事务
        session.beginTransaction();
        Criteria criteria = session.createCriteria(Employee.class);
        // 添加约束
        if (empName != null && !empName.trim().equals("")) {
            criteria.add(Restrictions.like("employeeName", empName, MatchMode.ANYWHERE));
        }
        criteria.add(Restrictions.between("employeeWeith", 1D, 30D));
        criteria.addOrder(Order.asc("employeeWeith"));
        List<Employee> ems = criteria.list();
        // 提交事物
        session.getTransaction().commit();
        session.close();
        HibernateUtil.getSessionFactory().close();
        return ems;
    }
    public static void main(String[] args) {
        List<Employee> employees = getEmps("liuba");
        for (Employee e : employees) {
            System.out.println(e.getEmployeeName());
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值