hibernate HQL

来源:互联网 发布:windows phone 8.1gdr2 编辑:程序博客网 时间:2024/06/02 19:31

本文主要使用一些测试方法来讲解HQL的具体应用

采用一对多的关系映射举例,两个类Dept{did,dname,emps},Emp{dept,eid,ename}

Dept.hbm.xml中

<hibernate-mapping package="com.tarena.demo.po">      <class name="Dept" table="t_dept">          <id name="did" column="did">              <generator class="identity"></generator>          </id>          <property name="dname"></property>          <set name="emps" cascade="all" inverse="true">              <key column="did"></key>              <one-to-many class="Emp"/>          </set>      </class>  </hibernate-mapping>  

Emp.hbm.xml中

<hibernate-mapping package="com.tarena.demo.po">      <class name="Emp" table="t_emp">          <id name="eid" column="eid">              <generator class="identity"></generator>          </id>          <property name="ename"></property>          <many-to-one name="dept" column="did" class="Dept"></many-to-one>          <query name="findEmpByEid">          <![CDATA[             from Emp where eid<?         ]]>          </query>      </class>  </hibernate-mapping>  

测试类:

public class TestHQL {      /**      * Hibernate生成关系模型      */       @Test      public void test00DDL(){          Configuration cfg = new Configuration().configure();          SchemaExport export = new SchemaExport(cfg);          export.create(true, true);      }      @Test      public void test01InitData(){          //10个部门,30个员工             Session session = HibernateUtils.getSession();          for(int i=1;i<=10;i++){              Dept dept = new Dept();              dept.setDname("部门"+i);              Set<Emp> emps = new HashSet<Emp>();              for(int j=1;j<=8;j++){                  Emp emp = new Emp();                  emp.setEname("员工_"+i+"_"+j);                  emp.setDept(dept);                  emps.add(emp);              }              dept.setEmps(emps);              session.save(dept);              session.clear();          }          session.beginTransaction().commit();          HibernateUtils.close(session);      }      /**      * 查询属性      * 查询一个属性,集合中的数据类型为String(对于dname属性),      * 如果对于did属性,则是Integer类型      */      @Test      public void test02(){          Session session = HibernateUtils.getSession();          String hql = "select dname from Dept";          Query query = session.createQuery(hql);          List<String> dnames = query.list();          for (String dname : dnames) {              System.out.println(dname);          }          HibernateUtils.close(session);      }      /**      * 查询多个属性,集合中数据的类型为Object[]      */      @Test      public void test03(){          Session session = HibernateUtils.getSession();          String hql = "select did,dname from Dept";          Query query = session.createQuery(hql);          List<Object[]> dnames = query.list();          for (Object[] o : dnames) {              System.out.println(o[0]+":"+o[1]);          }          HibernateUtils.close(session);      }      /**      * 查询多个属性,动态构建一个对象,Dept类必须要有new Dept(dname,did)构造器      * 和无参构造器      */      @Test      public void test04(){          Session session = HibernateUtils.getSession();          String hql = "select new Dept(did,dname) from Dept";          Query query = session.createQuery(hql);          List<Dept> depts = query.list();          for(Dept dept:depts){              System.out.println(dept.getDname());          }          HibernateUtils.close(session);      }      /**      * 简单对象查询      * foreach迭代,如果迭代一个空值,如果从该对象获得方法,不会出现空指针异常      * 内部采用的是iterator,当it.hasNext()才进行。而如果是空值,it.hasNext()为false      * 不会执行该对象的方法,因此不会出现空指针异常。      */      @Test      public void test05(){          Session session = HibernateUtils.getSession();          String hql = "select d from Dept d";          Query query = session.createQuery(hql);          List<Dept> depts = query.list();          for(Dept dept:depts){              System.out.println(dept.getDname()+","+dept.getDid());          }          HibernateUtils.close(session);      }      /**      * 对象查询,条件查询      * 参数的顺序从0开始      */      @Test      public void test06(){          Session session = HibernateUtils.getSession();          String hql = "select d from Dept d where dname=?";          Query query = session.createQuery(hql);          query.setString(0, "部门1");          List<Dept> depts = query.list();          for (Dept dept : depts) {              System.out.println(dept.getDname());          }          HibernateUtils.close(session);      }      /**      * 对象查询,条件查询      */      @Test      public void test07(){          Session session = HibernateUtils.getSession();          String hql = "select d from Dept d where dname=? and did=?";          List<Dept> depts = session.createQuery(hql).              setString(0, "部门1").setInteger(1, 1).list();          for (Dept dept : depts) {              System.out.println(dept.getDname());          }          HibernateUtils.close(session);      }      /**      * 查询所有员工信息      * 分页查询      * setFirstResult();确定查询的起点      * setMaxResult();确定查询的条数      */      @Test      public void test08(){          Session session = HibernateUtils.getSession();          String hql = "from Emp";          int currentPage = 5;          int pageSize = 5;          List<Emp> emps = session.createQuery(hql).              setFirstResult((currentPage-1)*pageSize).                  setMaxResults(pageSize).list();          for (Emp emp : emps) {              System.out.println(emp.getEname());          }          HibernateUtils.close(session);      }      /**      * 查询所有员工信息      * 查询最大页数      * 首先查询所有记录数      */      @Test      public void test09(){          Session session = HibernateUtils.getSession();          String hql = "select count(*) from Emp";          List<Long> list = session.createQuery(hql).list();          int rec = list.get(0).intValue();          int pageSize = 7;          System.out.println("最大页数为:");          System.out.println(rec%pageSize == 0?rec/pageSize:rec/pageSize+1);          HibernateUtils.close(session);      }      /**      * 使用命名查询      * 将hql语句写在映射文件中      * 查询ID号小于20的员工信息      * from Emp where eid<20      *  <query name="findEmpByEid">         <![CDATA[             from Emp where eid<?         ]]>         </query>         getNamedQuery(),获取Query对象      */      @Test      public void test10(){          Session session = HibernateUtils.getSession();          Query query = session.getNamedQuery("findEmpByEid");          query.setInteger(0, 20);          List<Emp> emps = query.list();          for (Emp emp : emps) {              System.out.println(emp.getEid()+":"+emp.getEname());          }          HibernateUtils.close(session);      }      /**      * 在hibernate 中使用sql查询      * select * from t_emp;      */      @Test      public void test11(){          Session session = HibernateUtils.getSession();          String sql = "select * from t_emp";          SQLQuery query = session.createSQLQuery(sql);          List<Object[]> list = query.list();          for (Object[] o : list) {              System.out.println(o[0]+":"+o[1]+":"+o[2]);          }          HibernateUtils.close(session);      }  }  

转自博主地址

0 0
原创粉丝点击