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页面中测试过,可以正常使用,没有错误。