在上一篇中,大致学习了hibernate的基本查询:HQL基本查询,今天,继续昨天的步伐,继续学习hibernate的基本查询。。。。。
1、hql聚合函数,先大致列一下hql的聚合函数有哪些吧:
在SQL中,我们的聚合函数也是这些,并且用法也相同 。继续昨天的方式,用一个函数来展示:
/** * HQL 聚合函数的使用 */ @Test public void HQLAggregate(){ Transaction tx=null; Session session=null; try{ session=HibernateUtils.getSession(); tx=session.beginTransaction(); String hql="select min(stu.age) from Student stu"; Query query=session.createQuery(hql); @SuppressWarnings("rawtypes") List list=query.list(); System.out.println(list.get(0)); tx.commit(); }catch(HibernateException he){ if(tx!=null){ tx.rollback(); } he.printStackTrace(); }finally{ HibernateUtils.closeSession(session); } }
需要注意的是,得到的结果是一个list集合,这样很方便的就可以使用操作集合的方法来进行结果的处理来。
2、HQL分组查询:关键字 group by:
通常,group by 会和聚集函数一起使用
/** * HQL 分组函数 */ @Test public void gruopFunction(){ Transaction tx=null; Session session=null; try{ session=HibernateUtils.getSession(); tx=session.beginTransaction(); String hql="select count(stu.id),stu.clazz from Student stu group by stu.clazz having avg(stu.age)>20"; Query query=session.createQuery(hql); @SuppressWarnings("unchecked") List<Object[]> list=query.list(); for(Object[]objs:list){ for(Object obj:objs){ System.out.println(obj); } System.out.println("-----分组信息-------"); } tx.commit(); }catch(HibernateException he){ if(tx!=null){ tx.rollback(); } he.printStackTrace(); }finally{ HibernateUtils.closeSession(session); } }
这里的hql语句应该不难理解,学过SQL的同学们应该都会嘀
3、分页查询:这个最实用来,在绝大多数的管理系统中,都会涉及到分页查询
Query接口提供以下两个用于分页显示查询结果的方法:
setFirstResult(int firstResult)
setMaxResult(int maxResults)
/** * 分页查询 * @param pageNo 页数 * @param pageSize 分页大小 */ public void selectByPage(int pageNo,int pageSize){ Transaction tx=null; Session session=null; try{ session=HibernateUtils.getSession(); tx=session.beginTransaction(); String hql="from Student"; Query query=session.createQuery(hql).setFirstResult((pageNo-1)*pageSize).setMaxResults(pageSize); @SuppressWarnings("unchecked") List<Student> list=(List<Student>)query.list(); for(Student stu:list){ System.out.println(stu); } tx.commit(); }catch(HibernateException he){ if(tx!=null){ tx.rollback(); } he.printStackTrace(); }finally{ HibernateUtils.closeSession(session); } }
4、批量更新或者删除
在Hibernate3以后,HQL新增了update与delete语句,可以直接使用HQL指定更新或删除。
/** * HQL 更新或者删除 */ @Test public void updateOrDelete(){ Transaction tx=null; Session session=null; try{ session=HibernateUtils.getSession(); tx=session.beginTransaction(); String hql="update Student set name='lixiaoyao' where id=:id"; Query query=session.createQuery(hql); query.setInteger("id", 1); int i=query.executeUpdate(); System.out.println(i); if(i>0){ System.out.println("更新成功"); }else{ System.out.println("更新失败"); } tx.commit(); }catch(HibernateException he){ if(tx!=null){ tx.rollback(); } he.printStackTrace(); }finally{ HibernateUtils.closeSession(session); } }
如果是删除的话,只需将上面的hql改为:
String hql = "DELETE Student WHERE name = :id"; Query query = session.createQuery(hql); query.setInteger(“id”,1); int count = query.executeUpdate();
5、hibernate命名查询
hibernate的命名查询需要把查询语句写到关系对象映射文件中,此处,将下面的配置信息写到Student.hbm.xml文件中
<!-- 配置hibernate的命名查询 --> <!-- name属性是必须的 --> <query name="studentHql"> <!-- CDATA告诉xml的解析器不要解析它后面[]中的内容,而其中的内容就是HQL语句 --> <![CDATA[from Student]]> </query>
需要注意的是:<query>标签是和<class> 标签同级的,如果不是会抛出异常,命名查询语句可以是HQL语句,也可以是本地SQL语句,程序代码也不区分命名查询语句的类型,一律通过Session的getNameQuery()方法来获得查询语句
/** * HQL的命名查询方式 */ @Test public void selectByNamed(){ Transaction tx=null; Session session=null; try{ session=HibernateUtils.getSession(); tx=session.beginTransaction(); Query query=session.getNamedQuery("studentHql"); @SuppressWarnings("unchecked") List<Student> list=(List<Student>)query.list(); for(Student stu:list){ System.out.println(stu); } tx.commit(); }catch(HibernateException he){ if(tx!=null){ tx.rollback(); } he.printStackTrace(); }finally{ HibernateUtils.closeSession(session); } }