hql连接查询及外置命名查询

来源:互联网 发布:二分查找算法 编辑:程序博客网 时间:2024/05/15 01:34

一、连接查询


        在sql中经常使用连接查询来获取多个对象的合集,其中经常用到的有inner join、left join、right join等,分别指代内连接查询、左外连接查询、右外连接查询,它们在查询时返回的内容分别是实体之间的笛卡尔积,查询的内容及左表的一些内容,查询内容及右表的一些内容,查询的功能强大。hql的连接查询方法和sql的连接查询在查询结果上是相同的,但是在查询语句上稍有区别。


 1.1 内连接


        hql的内连接查询可使用inner join语句或者join语句查询,获取的结果集是笛卡尔积。同sql的内连接查询类似,hql的join查询又分为显式与隐式两种,显示的查询是指查询字符串中有join关键字,隐式的查询在字符串中不需要添加join。


  1. //内连接  
  2. @SuppressWarnings({ "unchecked""rawtypes" })  
  3. public void testQuery(){  
  4.     Session session=null;  
  5.       
  6.     try{  
  7.         session=HibernateUtils.getSession();  
  8.         session.beginTransaction();  
  9.           
  10.         //返回结果集属性列表,元素类型和实体类中的属性类型一致  
  11.         List students=session.createQuery("select s.name,c.name from Student s join s.classes c").list();  
  12.           
  13.         for(Iterator ite=students.iterator();ite.hasNext();){  
  14.             Object[] obj=(Object[])ite.next();  
  15.             System.out.println(obj[0]);  
  16.         }  
  17.           
  18.         session.getTransaction().commit();  
  19.     }catch(Exception e){  
  20.         e.printStackTrace();  
  21.         session.getTransaction().rollback();  
  22.     }finally{  
  23.         HibernateUtils.closeSession(session);  
  24.     }  
  25. }  


 1.2 外连接

     外连接又分为左外连接和右外连接查询,查询方法类似,但是查询出的结果集不同,它们在查询结果上和SQL的外连接相同,不同的是写法,具体使用代码如下:


  1. @SuppressWarnings({ "unchecked""rawtypes" })  
  2. public void testQuery(){  
  3.     Session session=null;  
  4.       
  5.     try{  
  6.         session=HibernateUtils.getSession();  
  7.         session.beginTransaction();  
  8.           
  9.         //返回结果集属性列表,元素类型和实体类中的属性类型一致  
  10.         List students=session.createQuery("select s.name,c.name from Student s left join s.classes c").list();  
  11.           
  12.         for(Iterator ite=students.iterator();ite.hasNext();){  
  13.             Object[] obj=(Object[])ite.next();  
  14.             System.out.println(obj[0]);  
  15.         }  
  16.           
  17.         session.getTransaction().commit();  
  18.     }catch(Exception e){  
  19.         e.printStackTrace();  
  20.         session.getTransaction().rollback();  
  21.     }finally{  
  22.         HibernateUtils.closeSession(session);  
  23.     }  
  24. }  

       上面的代码使用的是左外连接查询语句,相应的右外连接查询的方法和左外连接类似,将left转换为right即可。查询到的数据被保存到list对象中,可通过list来获取查询内容。


二、外置命名查询


       外置命名查询是指将查询语句写到映射文件中,在映射文件中使用<query>标签来定义hql语句,这样定义的hql语句就能够实现功能配置功能,如果出现问题只需要修改配置即可。如果想用使用该sql语句,可在程序中使用session.getNamedQuery()方法得到hql查询串,如下示例。


  2.1 外置查询语句

      下面示例中演示了外置查询语句的应用,在映射文件中添加<query>标签,并为该标签添加name属性,将字符串添加到<![CDATA[]]>中,这样既可在程序中按照query的name属性获取对应的查询字符串了。

  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC   
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  5. <hibernate-mapping>  
  6.     <class name="com.src.hibernate.Student" table="t_student">  
  7.         <id name="id">  
  8.             <generator class="native"/>  
  9.         </id>  
  10.         <property name="name"/>  
  11.         <property name="createTime"></property>  
  12.         <!-- 在多的一端Student中添加一行新的Classes列 ,并且列的名称要和Classes.hbm.xml的列明相同-->  
  13.         <many-to-one name="classes" column="classesid"></many-to-one>  
  14.     </class>  
  15.       
  16.     <query name="queryStudent">  
  17.         <![CDATA[ 
  18.             select s from Student s where s.id<? 
  19.         ]]>  
  20.     </query>  
  21.       
  22. </hibernate-mapping>  


       外置的命名查询将查询语句放到了映射文件中,所以它可以被认为是公共的查询字符串,在程序文件中都可以查询使用该字符串,这是它的优点,这样其它的程序文件就都可以获取使用了,另外作为公共的字符串增加了修改的便利性。


  2.2 程序应用


       定义了外置的查询语句后要在程序中使用,hql提供了getNameQuery方法来获取外置的查询语句串,该方法中需要添加一个外置的游标名称,hql会根据游标名称查询获取相对应的sql语句块,如下的程序代码:


  1. //外置命名查询  
  2. @SuppressWarnings({ "unchecked""rawtypes" })  
  3. public void testQuery(){  
  4.     Session session=null;  
  5.       
  6.     try{  
  7.         session=HibernateUtils.getSession();  
  8.         session.beginTransaction();  
  9.           
  10.         List students=session.getNamedQuery("queryStudent").setParameter(010).list();  
  11.           
  12.         for(Iterator ite=students.iterator();ite.hasNext();){  
  13.             Student obj=(Student)ite.next();  
  14.             System.out.println(obj.getName());  
  15.         }  
  16.           
  17.         session.getTransaction().commit();  
  18.     }catch(Exception e){  
  19.         e.printStackTrace();  
  20.         session.getTransaction().rollback();  
  21.     }finally{  
  22.         HibernateUtils.closeSession(session);  
  23.     }  
  24. }  


结语


        有关hql的连接查询方法和外置命名查询方法讨论完成,hql的连接查询方法类似于sql的连接查询,可以认为它就是sql的一种包装,查询相当的简单,另外外置的命名查询可看做是定义了一个公共的查询字符串,程序文件都可以使用该字符串。

0 0
原创粉丝点击