Hibernate实现分页的工具类

来源:互联网 发布:python win32api 安装 编辑:程序博客网 时间:2024/05/16 01:37

1、 分析查询方式

a)        HQL语句查询

面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性其他部分不区分大小写);HQL中查的是对象而不是和表,并且支持多态;HQL主要通过Query来操作

b)       Criteria对象查询

Criteria是一种比HQL更面向对象的查询方式;Criteria的创建方式。

2、 创建工具类ListPageUtil并创建两个静态方法,

a)        Integer getSize(Class clazz):用来返回指定对象对应的表的总记录数。

b)        List ListPage(Integer pageSize,IntegernowPage,Class clazz) 指定每页大小和当前页,并传入指定的类,返回当前显示的所有记录数并用List集合返回。

c)        把构造函数访问权限设置成私有,单例类,不能将其用new实例化,只能调用其中静态方法。

3、 实现方法

a)        List ListPage(IntegerpageSize,Integer nowPage,Class clazz)

                       i.             HQL方式代码实现如下:

public static List listPage(Integer pageSize,Integer nowPage,Classclazz){      

              /*使用HQL查询实现分页*/

       Session session=null;

       //声明返回值

       List entities=null;

       /*定义HQL查询语句(后面为指定获取它的类名)*/

       String hql="from "+clazz.getName();

       /*计算出从哪一条记录开始查询*/

       Integer nowCount=pageSize*(nowPage-1);

       try{

           /*获取session对象*/

           session=HibernateUtil.getSession();

           /*根据hql语句获取到Query对象*/

           Query query=session.createQuery(hql);

           /*设置从第几条记录开始查询*/

           query.setFirstResult(nowCount);

           /*设置一共查询出多少条*/

           query.setMaxResults(pageSize);

           /*指定并返回集合*/

           entities=query.list();

           return entities;

       }finally{

           if(session!=null){

              //释放资源

              session.close();

           }

       }

}

                     ii.             Criteria对象查询代码实现如下:

    public static List listPage(Integer pageSize,Integer nowPage,Classclazz){

       /*利用Criteria对象查询实现分页*/

       Session session=null;

       //声明返回值

       List entities=null;

       try{

           session=HibernateUtil.getSession();

           //利用criteria对象查询出指定的对象

           Criteria cri=session.createCriteria(clazz);

           cri.setFirstResult(pageSize*(nowPage-1));

           cri.setMaxResults(pageSize);

           entities=cri.list();

           return entities;

       }finally{

           if(session!=null){

              //释放资源

              session.close();

           }

}

b)       List getSize(Class clazz)

/*查询指定对象的总记录数*/

    public static Integer getSize(Class clazz){

       Session session=null;

       //声明返回值

       Integer size=0;

       /*构造HQL查询语句*/

       String hql="selectcount(*) from "+clazz.getName();

       try{

           /*获取session对象*/

           session=HibernateUtil.getSession();

           /*根据hql语句得到query对象*/

           Query query=session.createQuery(hql);

           /*将结果先转换成字符串再并解析成整型类型*/

           size=Integer.parseInt(query.uniqueResult().toString());

           /*返回结果*/

           return size;

       }finally{

           if(session!=null){

              //释放资源

              session.close();

           }

       }

}

分页收获:开始显示的时候用的HQL查询,接受的参数是Class类型,但是没有办法构造出对应的HQL语句,因为前面带有包的前缀,如 java.lang.String。在Criteria对象查询不会遇到这种情况,因为它是更加面向对象的查询方式。

       在接受到Class类的对象时候,只要用getName方法则可以获取到名字,构造的HQL语句带有前缀的包名也不会影响结果,比如构造出的HQL查询语句是  from cn.csdn.domain.User 。也可以解析并返回正确的结果。

本工具类已在JSP页面中测试过,可以正常使用,没有错误。

原创粉丝点击