Hibernate 分页查询 HQL查询
- - ITeye博客/* 前提介绍:. * SQL: 查询的直接对象是数据库中的表(表的结构)--遵循的是国际数据库公共的标准. 只属于Hibernate 这个ORM 框架,查询的对象不是数据库的表,而是表对应的持久化对象;---操作的是对象. 只属于ORM框架,它是没有SQL出现的查询(动态查询),查询只存在对象操作上.
package com.svse.dao; import java.util.ArrayList; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.criterion.Projection; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import com.svse.entity.TDept; import com.svse.entity.TEmp; import com.svse.util.HibernateSessionFactoryDaoSupportImpl; //各种查询的测试 public class QueryDao extends HibernateSessionFactoryDaoSupportImpl { /*************************************HQL 查询*********************************************************/ /*** * 类型:位置参数查询--? * 条件:查询性别为男的所有员工的信息 */ public List findBySex(String sex){ List ar = new ArrayList(); /* 第一步:通过HQL语句创建Query对象 */ Query query = this.getSession().createQuery("FROM TEmp a inner join fetch a.TDept where a.ESex=?"); /* 第二步:设置参数值 ? 从 0 开始 */ query.setString(0, sex); /* 第三步:获取集合数据 */ ar = query.list(); //简写 //ar = this.getSession().createQuery("FROM TEmp a inner join fetch a.TDept where a.ESex=?").setString(0, sex).list(); /* 第四步:关闭 */ this.closeAll(); return ar; } /*** * 类型:占位符查询 * 条件:性别为男的所有员工信息,部门为研发部 */ public List findEmpBySex_1(String sex,String dep){ //多写 List ar = new ArrayList(); Query query = this.getSession().createQuery("FROM TEmp a inner join fetch a.TDept where a.ESex=:sex and a.TDept.PName=:dep"); query.setString("sex", sex); query.setString("dep",dep); ar = query.list(); //简写 //ar = this.getSession().createQuery("FROM TEmp a inner join fetch a.TDept where a.ESex=:sex").setString("sex", sex).list(); this.closeAll(); return ar; } /*** * 类型:查询部分字段 * 条件:查询所有 * 注意:因为HQL操作的是持久化对象,所有查询部分字段返回的是不完整的对象,因此返回的为Object对象的数组 */ public List findSomeField(){ List ar = this.getSession().createQuery("select a.EName ,a.ESex from TEmp a").list(); this.closeAll(); return ar; } /*** * 类型:单一值的查询 * 条件:查询条数、最大值、最小值、平均值 * */ public double findUniqueValue(int type){ String hql = ""; switch (type) { case 1: hql = "select count(*) from TEmp"; //查询行目总数 break; case 2: hql = "select max(EId) from TEmp"; break; case 3: hql = "select min(EId) from TEmp"; break; case 4: hql = "select avg(EId) from TEmp"; } double value =Double.parseDouble( this.getSession().createQuery(hql).uniqueResult().toString()); this.closeAll(); return value; } /*** * 类型:模糊查询 * 条件:查询出名字中带‘小’的,并且是研发部的 */ public List findEmpByLike(String term,String dept){ List ar = new ArrayList(); Query query = this.getSession().createQuery("FROM TEmp a inner join fetch a.TDept where a.EName like ? and a.TDept.PName=:dept"); query.setString(0, '%'+term+'%'); query.setString("dept",dept); ar = query.list(); return ar; } /***************************************************************************************************/ /********************************************* QBC 查询 **************************************************/ /*** * 类型:QBC 带条件的查询 * 条件:性别为男的 */ public List qbc_findEmpBySex(String sex){ List ar = new ArrayList(); /* 第一步:得到动态工具 */ Criteria criteria = this.getSession().createCriteria(TEmp.class); /* 第二步:装载参数 ,直接对应实体属性 * Restrictions:限制,约束 */ criteria.add(Restrictions.eq("ESex", sex)); /* 表与表之间的关联 */ criteria.createCriteria("TDept"); /* 获得数据对象 */ ar = criteria.list(); //简写 //ar = this.getSession().createCriteria(TEmp.class).add(Restrictions.eq("ESex",sex)).createCriteria("TDept").list(); this.closeAll(); return ar; } /*** * 类型:QBC 的模糊查询 * 条件:名字中含有小的 ,研发部的 */ public List qbc_findEmpLikeEname(String term,String dept){ List ar = this.getSession().createCriteria(TEmp.class).add(Restrictions.like("EName",term)).createCriteria("TDept").add(Restrictions.eq("PName",dept)).list(); this.closeAll(); return ar; } /*** * 类型:集合查询 * 条件:查总函数,查行数 */ public double qbc_collection(){ double value = 0; //获取工具 Criteria criteria = this.getSession().createCriteria(TEmp.class); //设置参数后去行数 criteria.setProjection(Projections.rowCount()); //获取单一值 value = Double.parseDouble(criteria.uniqueResult().toString()); return value; } /***********************************************************************************/ /*******************************利用HQL进行数据的更改************************************************/ /*** * 类型:批量的更新数据 * 条件:将ID 为 1 的员工的名字改为:王八蛋 */ public void upEmp(String term,int aim){ this.beginTransaction(); Query query = this.getSession().createQuery("update TEmp a set a.EName=? where a.EId =:aim"); query.setString(0,term); query.setInteger("aim",aim); query.executeUpdate(); this.commitTransaction(); } /** * 类型:执行SQL语句 * */ public void executeSQL(){ Query query = this.getSession().createSQLQuery("select * from t_emp a ,t_dept b where b.p_id = a.p_id").addEntity(TEmp.class); List ar = query.list(); this.closeAll(); } /** * 类型:分页查询 * 条件:开始页数,每页最大的行数 * curPage:页码; * lines:每页显示数据条数; * ar_index:集合对应的索引; * 解释:根据此规则实现页面分页效果,例如:达到每页 5 条数据, * 首页: ar_index = (curPage-1)*5 == 0 * 第二页: ar_index = (curPage-1)*5 == 5 * 第三页: ar_index = (curPage-1)*5 == 10 * 。。。。。。 */ public List queryForPages(int curPage,int lines){ Query query = this.getSession().createQuery("FROM TEmp a inner join fetch a.TDept"); query.setFirstResult((curPage-1)*lines); query.setMaxResults(lines); List ar = query.list(); this.closeAll(); return ar; } /** * @return 数据的总条数 */ public int getCounts(){ int count = Integer.parseInt((this.getSession().createCriteria(TEmp.class).setProjection(Projections.rowCount()).uniqueResult().toString())); this.closeAll(); return count; } public static void main(String[] args) { QueryDao dao = new QueryDao(); List ar = dao.queryForPages(1, 3); System.out.println("*********************第一页*******************"); for (int i = 0; i <ar.size(); i++) { TEmp emp = (TEmp) ar.get(i); System.out.print(emp.getEId()+" "+emp.getEName()+" "+emp.getTDept().getPName()); System.out.println(); } System.out.println("*********************第二页*******************"); ar = dao.queryForPages(2, 3); for (int i = 0; i <ar.size(); i++) { TEmp emp = (TEmp) ar.get(i); System.out.print(emp.getEId()+" "+emp.getEName()+" "+emp.getTDept().getPName()); System.out.println(); } } }