zoukankan      html  css  js  c++  java
  • 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. }  


     

  • 相关阅读:
    如何优化数据库中数据的查询
    2句sql语句的比较
    未来五年程序员应当具备的十项技能
    中小IT企业如何留住80后技术人才
    ORACLE的sign函数和DECODE函数
    Windows Server 2008系统 安装Oracle 10g 错误
    ORACLE 错误 ora01830 解决方法
    oracle instr函数
    Oracle 9i安装时没有找到OCS4J.properties 解决办法
    C# 中的委托和事件
  • 原文地址:https://www.cnblogs.com/HuiLove/p/5074467.html
Copyright © 2011-2022 走看看