Hibernate中HQL语句的使用

 

Hibernate中HQL语句的使用

标签: hibernateHibernatehqlHQL
 分类:

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

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

Dept.hbm.xml中

  1. <hibernate-mapping package="com.tarena.demo.po">  
  2.     <class name="Dept" table="t_dept">  
  3.         <id name="did" column="did">  
  4.             <generator class="identity"></generator>  
  5.         </id>  
  6.         <property name="dname"></property>  
  7.         <set name="emps" cascade="all" inverse="true">  
  8.             <key column="did"></key>  
  9.             <one-to-many class="Emp"/>  
  10.         </set>  
  11.     </class>  
  12. </hibernate-mapping>  


Emp.hbm.xml中

  1. <hibernate-mapping package="com.tarena.demo.po">  
  2.     <class name="Emp" table="t_emp">  
  3.         <id name="eid" column="eid">  
  4.             <generator class="identity"></generator>  
  5.         </id>  
  6.         <property name="ename"></property>  
  7.         <many-to-one name="dept" column="did" class="Dept"></many-to-one>  
  8.         <query name="findEmpByEid">  
  9.         <![CDATA[ 
  10.             from Emp where eid<? 
  11.         ]]>  
  12.         </query>  
  13.     </class>  
  14. </hibernate-mapping>  


测试类:

  1. public class TestHQL {  
  2.       
  3.     /** 
  4.      * Hibernate生成关系模型 
  5.      */   
  6.     @Test  
  7.     public void test00DDL(){  
  8.         Configuration cfg = new Configuration().configure();  
  9.         SchemaExport export = new SchemaExport(cfg);  
  10.         export.create(true, true);  
  11.     }  
  12.     @Test  
  13.     public void test01InitData(){  
  14.         //10个部门,30个员工     
  15.         Session session = HibernateUtils.getSession();  
  16.         for(int i=1;i<=10;i++){  
  17.             Dept dept = new Dept();  
  18.             dept.setDname("部门"+i);  
  19.             Set<Emp> emps = new HashSet<Emp>();  
  20.             for(int j=1;j<=8;j++){  
  21.                 Emp emp = new Emp();  
  22.                 emp.setEname("员工_"+i+"_"+j);  
  23.                 emp.setDept(dept);  
  24.                 emps.add(emp);  
  25.             }  
  26.             dept.setEmps(emps);  
  27.             session.save(dept);  
  28.             session.clear();  
  29.         }  
  30.         session.beginTransaction().commit();  
  31.         HibernateUtils.close(session);  
  32.     }  
  33.       
  34.     /** 
  35.      * 查询属性 
  36.      * 查询一个属性,集合中的数据类型为String(对于dname属性), 
  37.      * 如果对于did属性,则是Integer类型 
  38.      */  
  39.     @Test  
  40.     public void test02(){  
  41.         Session session = HibernateUtils.getSession();  
  42.         String hql = "select dname from Dept";  
  43.         Query query = session.createQuery(hql);  
  44.         List<String> dnames = query.list();  
  45.         for (String dname : dnames) {  
  46.             System.out.println(dname);  
  47.         }  
  48.         HibernateUtils.close(session);  
  49.     }  
  50.       
  51.     /** 
  52.      * 查询多个属性,集合中数据的类型为Object[] 
  53.      */  
  54.     @Test  
  55.     public void test03(){  
  56.         Session session = HibernateUtils.getSession();  
  57.         String hql = "select did,dname from Dept";  
  58.         Query query = session.createQuery(hql);  
  59.         List<Object[]> dnames = query.list();  
  60.         for (Object[] o : dnames) {  
  61.             System.out.println(o[0]+":"+o[1]);  
  62.         }  
  63.         HibernateUtils.close(session);  
  64.     }  
  65.     /** 
  66.      * 查询多个属性,动态构建一个对象,Dept类必须要有new Dept(dname,did)构造器 
  67.      * 和无参构造器 
  68.      */  
  69.     @Test  
  70.     public void test04(){  
  71.         Session session = HibernateUtils.getSession();  
  72.         String hql = "select new Dept(did,dname) from Dept";  
  73.         Query query = session.createQuery(hql);  
  74.         List<Dept> depts = query.list();  
  75.         for(Dept dept:depts){  
  76.             System.out.println(dept.getDname());  
  77.         }  
  78.         HibernateUtils.close(session);  
  79.     }  
  80.       
  81.     /** 
  82.      * 简单对象查询 
  83.      * foreach迭代,如果迭代一个空值,如果从该对象获得方法,不会出现空指针异常 
  84.      * 内部采用的是iterator,当it.hasNext()才进行。而如果是空值,it.hasNext()为false 
  85.      * 不会执行该对象的方法,因此不会出现空指针异常。 
  86.      */  
  87.     @Test  
  88.     public void test05(){  
  89.         Session session = HibernateUtils.getSession();  
  90.         String hql = "select d from Dept d";  
  91.         Query query = session.createQuery(hql);  
  92.         List<Dept> depts = query.list();  
  93.         for(Dept dept:depts){  
  94.             System.out.println(dept.getDname()+","+dept.getDid());  
  95.         }  
  96.         HibernateUtils.close(session);  
  97.     }  
  98.     /** 
  99.      * 对象查询,条件查询 
  100.      * 参数的顺序从0开始 
  101.      */  
  102.     @Test  
  103.     public void test06(){  
  104.         Session session = HibernateUtils.getSession();  
  105.         String hql = "select d from Dept d where dname=?";  
  106.         Query query = session.createQuery(hql);  
  107.         query.setString(0, "部门1");  
  108.         List<Dept> depts = query.list();  
  109.         for (Dept dept : depts) {  
  110.             System.out.println(dept.getDname());  
  111.         }  
  112.         HibernateUtils.close(session);  
  113.     }  
  114.       
  115.     /** 
  116.      * 对象查询,条件查询 
  117.      */  
  118.     @Test  
  119.     public void test07(){  
  120.         Session session = HibernateUtils.getSession();  
  121.         String hql = "select d from Dept d where dname=? and did=?";  
  122.         List<Dept> depts = session.createQuery(hql).  
  123.             setString(0, "部门1").setInteger(1, 1).list();  
  124.         for (Dept dept : depts) {  
  125.             System.out.println(dept.getDname());  
  126.         }  
  127.         HibernateUtils.close(session);  
  128.     }  
  129.       
  130.     /** 
  131.      * 查询所有员工信息 
  132.      * 分页查询 
  133.      * setFirstResult();确定查询的起点 
  134.      * setMaxResult();确定查询的条数 
  135.      */  
  136.     @Test  
  137.     public void test08(){  
  138.         Session session = HibernateUtils.getSession();  
  139.         String hql = "from Emp";  
  140.         int currentPage = 5;  
  141.         int pageSize = 5;  
  142.         List<Emp> emps = session.createQuery(hql).  
  143.             setFirstResult((currentPage-1)*pageSize).  
  144.                 setMaxResults(pageSize).list();  
  145.         for (Emp emp : emps) {  
  146.             System.out.println(emp.getEname());  
  147.         }  
  148.         HibernateUtils.close(session);  
  149.     }  
  150.       
  151.       
  152.     /** 
  153.      * 查询所有员工信息 
  154.      * 查询最大页数 
  155.      * 首先查询所有记录数 
  156.      */  
  157.     @Test  
  158.     public void test09(){  
  159.         Session session = HibernateUtils.getSession();  
  160.         String hql = "select count(*) from Emp";  
  161.         List<Long> list = session.createQuery(hql).list();  
  162.         int rec = list.get(0).intValue();  
  163.         int pageSize = 7;  
  164.         System.out.println("最大页数为:");  
  165.         System.out.println(rec%pageSize == 0?rec/pageSize:rec/pageSize+1);  
  166.         HibernateUtils.close(session);  
  167.     }  
  168.       
  169.     /** 
  170.      * 使用命名查询 
  171.      * 将hql语句写在映射文件中 
  172.      * 查询ID号小于20的员工信息 
  173.      * from Emp where eid<20 
  174.      *  <query name="findEmpByEid"> 
  175.         <![CDATA[ 
  176.             from Emp where eid<? 
  177.         ]]> 
  178.         </query> 
  179.          
  180.         getNamedQuery(),获取Query对象 
  181.      */  
  182.     @Test  
  183.     public void test10(){  
  184.         Session session = HibernateUtils.getSession();  
  185.         Query query = session.getNamedQuery("findEmpByEid");  
  186.         query.setInteger(0, 20);  
  187.         List<Emp> emps = query.list();  
  188.         for (Emp emp : emps) {  
  189.             System.out.println(emp.getEid()+":"+emp.getEname());  
  190.         }  
  191.         HibernateUtils.close(session);  
  192.     }  
  193.       
  194.     /** 
  195.      * 在hibernate 中使用sql查询 
  196.      * select * from t_emp; 
  197.      */  
  198.     @Test  
  199.     public void test11(){  
  200.         Session session = HibernateUtils.getSession();  
  201.         String sql = "select * from t_emp";  
  202.         SQLQuery query = session.createSQLQuery(sql);  
  203.         List<Object[]> list = query.list();  
  204.         for (Object[] o : list) {  
  205.             System.out.println(o[0]+":"+o[1]+":"+o[2]);  
  206.         }  
  207.         HibernateUtils.close(session);  
  208.     }  
  209.       
  210. }  


 

posted @ 2015-12-24 22:05  LAOS  阅读(219)  评论(0编辑  收藏  举报