夢幻之旅

          DEBUG - 天道酬勤

             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks

          Hibernate檢索對象的方式
          教學內容
          HQL檢索方式
          QBC檢索方式
          本地SQL檢索方式

          Hibernate提供的檢索對象的方式
          導航對象圖檢索方式
          根據已經加載的對象,導航到其他對象。例如,對于已經加載的Customer對象,調用它的getOrders().iterator()方法就可以導航到所有關聯的Order對象,假如在關聯級別使用了延遲加載檢索策略,那么首次執行此方法時,Hibernate會從數據庫中加載關聯的Order對象,否則就從緩存中取得Order對象。
          OID檢索方式
          按照對象的OID來檢索對象。Session的get()和load()方法提供了這種功能。如果在應用程序中事先知道了OID,就可以使用這種檢索對象的方式。
          HQL檢索方式
          使用面向對象的HQL查詢語言。Session的find()方法用于執行HQL查詢語句。此外,Hibernate還提供了Query接口,它是Hibernate提供的專門的HQL查詢接口,能夠執行各種復雜的HQL查詢語句。本章有時把HQL檢索方式簡稱為HQL。
          QBC檢索方式
          使用QBC(Query By Criteria)API來檢索對象。這種API封裝了基于字符串形式的查詢語句,提供了更加面向對象的接口。本章有時把QBC檢索方式簡稱為QBC。
          本地SQL檢索方式
          使用本地數據庫的SQL查詢語句。Hibernate會負責把檢索到的JDBC ResultSet結果集映射為持久化對象圖。

          HQL檢索方式
          HQL(Hibernate Query Language)是面向對象的查詢語言,它和SQL查詢語言有些相似。在Hibernate提供的各種檢索方式中,HQL是使用最廣的一種檢索方式。它具有以下功能:
          在查詢語句中設定各種查詢條件
          支持投影查詢,即僅檢索出對象的部分屬性
          支持分頁查詢
          支持連接查詢
          支持分組查詢,允許使用having和group by關鍵字
          提供內置聚集函數,如sum()、min()和max()
          能夠調用用戶定義的SQL函數
          支持子查詢,即嵌入式查詢
          支持動態綁定參數
          Session的find()方法以及Query接口
          Session類的find()方法以及Query接口都支持HQL檢索方式。
          這兩者的區別在于,前者只是執行一些簡單HQL查詢語句的便捷方法,它不具有動態綁定參數的功能,而且在Hibernate3.x版本中,已經淘汰了find()方法;而Query接口才是真正的HQL查詢接口,它提供了以上列出的各種查詢功能。
          HQL檢索步驟
           //創建一個Query對象
          Query query=session.createQuery("from Customer as c where "
              +" c.name=:customerName "
              +"and c.age=:customerAge");
          //動態綁定參數
          query.setString("customerName","Tom");
          query.setInteger("customerAge",21);
          //執行查詢語句,返回查詢結果
          List result= query.list();
          HQL檢索步驟
           (1)通過Session的createQuery()方法創建一個Query對象,它包含一個HQL查詢語句。HQL查詢語句可以包含命名參數,如“customerName”和“customerAge”都是命名參數。
          (2)動態綁定參數。Query接口提供了給各種類型的命名參數賦值的方法,例如setString()方法用于為字符串類型的customerName命名參數賦值。
          (3)調用Query的list()方法執行查詢語句。該方法返回List類型的查詢結果,在List集合中存放了符合查詢條件的持久化對象。
          方法鏈編程風格
           List result=session.createQuery("……")
          .setString("customerName","Tom")
          .setInteger("customerAge",21)
          .list(); 
          方法鏈編程風格能使程序代碼更加簡潔。
          QBC檢索方式
          采用HQL檢索方式時,在應用程序中需要定義基于字符串形式的HQL查詢語句。
          QBC API 提供了檢索對象的另一種方式,它主要由Criteria接口、Criterion接口和Expression類組成,它支持在運行時動態生成查詢語句。
          QBC檢索方式
          //創建一個Criteria對象
          Criteria criteria=session.createCriteria(Customer.class);
          //設定查詢條件,然后把查詢條件加入到Criteria中
          Criterion criterion1= Expression.like("name", "T%") ;
          Criterion criterion2= Expression.eq("age", new Integer(21)) ;
          criteria=criteria.add(criterion1);
          criteria=criteria.add(criterion2);
          //執行查詢語句,返回查詢結果
          List result=criteria.list();
          QBC檢索步驟
          (1)調用Session的createCriteria()方法創建一個Criteria對象。
          (2)設定查詢條件。Expression類提供了一系列用于設定查詢條件的靜態方法,這些靜態方法都返回Criterion實例,每個Criterion實例代表一個查詢條件。Criteria的add()方法用于加入查詢條件。
          (3)調用Criteria的list()方法執行查詢語句。該方法返回List類型的查詢結果,在List集合中存放了符合查詢條件的持久化對象。對于以上程序代碼,當運行Criteria的list()方法時,Hibernate執行的SQL查詢語句為:
              select * from CUSTOMERS where NAME like 'T%' and AGE=21;

          方法鏈編程風格
          List result=session.createCriteria(Customer.class)
              .add(Expression.like("name", "T%")
              .add(Expression.eq("age", newInteger(21))
              .list();


          比較運算(大于)
          List list = session.createQuery("from Hx c where c.id>0")
          .list();
          List list = session.createCriteria(Hx.class)
          .add(Expression.gt("id", new Integer(0)))
           .list();
          比較運算(不等于)
          List list = session.createQuery("from Hx c where c.id<>0")
          .list();

          List list = session.createCriteria(Hx.class)
          .add(Expression.not(Expression.eq("name", "zmx")))
          .list();
          比較運算(不等)
          List list = session.createQuery("from Hx c where c.name is null")
          .list();
          List list = session.createCriteria(Hx.class)
          .add(Expression.not(Expression.isNull("name")))
          .list();
          比較運算(范圍)
          List list = session.createQuery("from Hx c where c.name in(‘zmx’)")
          .list();
          String names[]={“zmx”,”hx”};
          List list = session.createCriteria(Hx.class)
          .add(Expression.in(“name”,names))
          .list();
          模糊查詢
          List list = session.createQuery("from Hx c where c.name like ‘Z%’")
          .list();
          List list = session.createCriteria(Hx.class)
          .add(Expression.like(“name”,”Z%”)))
          .list();

          QBE查詢(query by Example)
          它是QBC的子功能,允許創建一個對象模板,然后檢索出所有和模板相同的對象,但功能不是很強大,且只支持=和like運算符
             Hx hx = new Hx();
             hx.setAge(33);
             List list = session.createCriteria(Hx.class)
                 .add(Example.create(hx)).list();
          查詢排序
          HQL方式
          List list = session.createQuery("from Hx c order by c.name")
                      .list();

          QBC方式
          List list = session.createCriteria(Hx.class)
                      .add(Expression.like("name","z%"))
                      .addOrder(Order.desc("name"))
                      .list();
          分頁查詢
           Query和Criteria接口都提供了用于分頁顯示查詢結果的方法:
          setFirstResult(int firstResult):設定從哪一個對象開始檢索,參數firstResult表示這個對象在查詢結果中的索引位置,索引位置的起始值為0。默認情況下,Query和Criteria接口從查詢結果中的第一個對象,也就是索引位置為0的對象開始檢索。
          setMaxResult(int maxResults):設定一次最多檢索出的對象數目。默認情況下,Query和Criteria接口檢索出查詢結果中所有的對象。

          分頁查詢
          //采用HQL檢索方式
          Query query = session.createQuery("from   
                  Customer c
                  order by c.name asc");
          query.setFirstResult(0);
          query.setMaxResults(10);
          List result = query.list();

          //采用QBC檢索方式
          Criteria criteria = session.createCriteria(
                       Customer.class);
          criteria.addOrder(
                        Order.asc("name") );
          criteria.setFirstResult(0);
          criteria.setMaxResults(10);
          List result = criteria.list();

          鏈索查詢
          List list = session.createQuery("from Hx")
                      .setFirstResult(0)
                      .setMaxResults(2)
                      .list();
          List list = session.createCriteria(Hx.class)
                      .setFirstResult(0)
                      .setMaxResults(2)
                      .list();
          檢索單個對象
          Query和Criteria都提供了返回單個對象的方法uniqueResult().
          先調用setMaxResult(1)方法,把最大檢索數目設為1,在調用uniqueResult()方法。

          Hx hx = (Hx)session.createQuery("from Hx")
                      .setMaxResults(1)
                      .uniqueResult();
          Hx hx = (Hx)session.createCriteria(Hx.class)
                   .addOrder(Order.asc("name"))
                   .setMaxResults(1)
                   .uniqueResult();
          與對象屬性綁定
          Hx hx = new Hx();
          hx.setAge("33");
          List list = session.createQuery("from Hx as c where c.age=:age")
                      .setProperties(hx)
                      .list();
          SQL內連接
          內連接就是傳統的連接操作,用join連接關聯表,on作為連接條件,where指定其他限定條件的查詢
          如:
          select hx.name,hx.age,hxhome.home from hx join hxhome on hx.id=hxhome.hxid
          SQL左外連接
          在結果表中包含第一個表中滿足的所有紀錄,如果是在連接條件上匹配紀錄,則第二個表返回相應的值,否則第二個表返回空值。
          如:
          select hx.name,hx.age,hxhome.home from hx  left join hxhome on hx.id=hxhome.hxid

          SQL右外連接
          在結果表中包含第二個表中滿足的所有紀錄,如果是在連接條件上匹配紀錄,則第一個表返回相應的值,否則第一個表返回空值。
          如:
          select hx.name,hx.age,hxhome.home from hx  right outer join hxhome on hx.id=hxhome.hxid

          迫切左外連接
          以下兩種檢索方式是等價的,它們都能同時迫切左外連接類B和類C:
          //HQL迫切左外連接檢索方式
          from A a left join fetch a.b b left join fetch a.c c where b is not
          null and c is not null

          //QBC迫切左外連接檢索方式
          List result=session.createCriteria(A.class)
          .setFetchMode("this.b",FetchMode.EAGER)
          .setFetchMode("this.c",FetchMode.EAGER)
          .add(Expression.isNotNull("this.b"))
          .add(Expression.isNotNull("this.c"))
          .list();
          投影查詢
          select關鍵字用于選擇對象的部分屬性,例如:
          Iterator it=session.createQuery(
              "select c.id,c.name,o.orderNumber "
           + "  from Customer c join  c.orders o "
           +" where o.orderNumber like 'T%'" ).list().iterator();

          while(it.hasNext()){
           Object[] row=(Object[])it.next();
           Long orderNumber=(String)row[2];
           System.out.println(id+" "+name+" "+orderNumber);
          }
          投影查詢
          HQL查詢語句對應的SQL語句為:
          select c.ID,c.NAME,o.ORDER_NUMBER
          from CUSTOMERS c inner join ORDERS o
          on c.ID=o.CUSTOMER_ID where o.ORDER_NUMBER like 'T%';
          以上查詢語句的查詢結果如下:
          +----+------+--------------+
          | ID | NAME | ORDER_NUMBER |
          +----+------+--------------+
          |  1 | Tom  | Tom_Order001 |
          |  1 | Tom  | Tom_Order002 |
          |  1 | Tom  | Tom_Order003 |
          +----+------+--------------+
          Query的list()方法返回的集合中包含三個對象數組類型的元素,每個對象數組代表以上查詢結果的一條記錄。

           

          posted on 2007-11-23 11:23 HUIKK 閱讀(702) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 桂东县| 竹北市| 大关县| 华容县| 新绛县| 西乡县| 岳阳市| 临洮县| 扎赉特旗| 平山县| 舟山市| 修文县| 莫力| 平遥县| 松江区| 无锡市| 准格尔旗| 土默特左旗| 唐海县| 陵水| 乌拉特中旗| 遂川县| 旅游| 荃湾区| 莫力| 嘉祥县| 博爱县| 邯郸县| 钟祥市| 通州市| 什邡市| 清河县| 砀山县| 措美县| 文水县| 石渠县| 清原| 永登县| 凌海市| 诸城市| 乐平市|