学习目标:
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());
}
}
}