隨筆-13  評論-9  文章-9  trackbacks-0
          Hib的檢索方式
          1'導航對象圖檢索方式。通過已經加載的對象,調用.iterator()方法可以得到order對象
          如果是首次執行此方法,Hib會從數據庫加載關聯的order對象,否則就從緩存中得到。
          2'OID檢索方式。通過session的get,load方法知道了OID的情況下可以使用
          3'HQL檢索方式。使用面向對象的HQL查詢語句session的find方法利用HQL來查詢
          4'QBC檢索方式。利用QBCAPI來檢索它是封裝了基于字符串的查詢語句
          5'本地的SQL檢索方式。使用本地數據庫的SQL查詢語句Hib會負責把檢索到的JDBC結果集映射為持久化對象圖。

          五種檢索方式的使用場合和特點:

          HQL?:?是面向對象的查詢語言,同SQL有些相似是Hib中最常用的方式。
          ???????查詢設定各種查詢條件。
          ???????支持投影查詢,檢索出對象的部分屬性。
          ???????支持分頁查詢,允許使用having和group?by
          ???????提供內制的聚集函數,sum(),min(),max()
          ???????能調用用戶的自定義SQL
          ???????支持子查詢,嵌入式查詢
          ???????支持動態綁定參數
          建議使用Query接口替換session的find方法。
          ???Query?Q?=?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();
          QBC?:??QBCAPI提供了另一種方式,主要是Criteria接口、Criterion接口和Expression類
          ???Criteria?criteria?=?session.createCriteria(customer.class);
          ???Criterion?criterion1?=?Expression.like("name","t%");
          ???Criterion?criterion2?=?Expression.eq("age",new?Integer(21));
          ???Critera?=?criteria.add(criterion1)?;
          ???Critera?=?criteria.add(criterion2)?;
          ???list?result?=?criteria.list();?
          ???或是:?list?result?=?session.createCriteria(Customer.class).add(Expression.eq("this.name","tom")).list();?
          SQL?:??采用HQL和QBC檢索時,Hib生成SQL語句適用所有數據庫。
          ???Query?query??=?session.createSQLQuery("select?{c.*}?from?customers?c?where?c.name?like?:?customername?"?+?"and?c.age?=?:customerage","c",customer.calss);
          ???query.setString("customername","tom");
          ???query.setInteger("customerage","21");
          ???list?result?=?query.list();
          /////////////多態查詢
          ???HQL?:session.createQuery("from?employee");
          ???QBC?:session.createCriteria(employee.class);
          ???HQL?:?session.createQuery("from?hourlyEmployee");
          ???QBC?:?session.createCriteria(hourlyEmployee.class);
          ???下面的HQL查詢語句將檢索出所有的持久化對象:
          ???from?java.lang.Object?;
          ???from?java.io.serializable?;
          ////////////查詢的排序
          ???1'查詢結果按照客戶姓名升序排列:
          ???HQL?:
          ????????Query?query?=?session.createQuery?("from?customer?c?order?by?c.name");
          ???QBC?:
          ????????Criteria?criteria?=?session.createCriteria(customer.class);
          ????????criteria.addOrder(order.asc("name"));
          ???HQL?:
          ????????Query?query?=?session.createQuery?("from?customer?c?order?by?c.name?asc?,?c.age?desc");
          ???QBC?:
          ????????Criteria?criteria?=?session.createCriteria(customer.class);
          ????????criteria.addOrder(order.asc?("name"));
          ????????criteria.addOrder(order.desc("age"));?

          ????????import?net.sf.hibernate.pression.Order
          ????????import?mypack.Order
          ????????...........
          ????????Criteria?criteria?=?session.createCritria?(mypack.Order.class);
          ????????criteria.addOrder(net.sf.hibernate.Order.asc("name"));
          ///////////HQL語句的參數綁定Query接口提供了綁定各種Hib映射類型的方法。
          ????????setBinary()
          ????????setString()
          ????????setBoolean()
          ????????setByte()
          ????????setCalendar()
          ????????setCharacter()
          ????????setDate()
          ????????setDouble()
          ????????setText()
          ????????setTime()
          ????????setTimestamp()
          ????????setEntity()//把參數與一個持久化類的事例綁定lsit?result?=?session.createQuery("from?order?o?where?o.customer?=????????????:customer").setEntity("customer"?,?customer).list?;
          ????????setParameter()//綁定任意類型的參數
          ????????setProperties()//把命名參數與一個對象的屬性值綁定?Query?query?=?session.createQuery("from?customer?c?where?c.name?=:?????name?"?+?"and?c.age?=:age"?);
          ????????Query.setProperties(customer);?

          過濾查詢結果中的重復元素?
          ?????使用Set集合來去除重復元素;或是使用distinct元素
          ?????Iterator?iterator?=?session.createQuery("select?distinct?c.name?from?customer?").list().iterator();
          ?????while(iterator.hasnext()){
          ???????????String?name?=?(String)?it.next()?;
          ?????}
          ///////////使用聚集函數
          count();?記錄的條數
          min();???求最小值
          max();???求最大值
          avg();???求平均值
          sum();???求和
          1'查詢customer中的所有記錄條數
          ???integer?i?=?(Integer)?session.createQuery("select?count(*)?from?customer").uniqueResult();
          只有在確定只有一個對象時候使用uniqueResult();
          2'查詢customer中的所有客戶的平均年齡
          ???integer?i?=?(Integer)?session.createQuery("select?avg(c.age)?from?customer?c?").uniqueResult();
          3'查詢customer中的客戶年齡的最大值、最小值
          一個數組可以看作一個對象
          ???object?[]?i?=?(Integer)?session.createQuery("select?max(c.age),min(c.age)?from?customer?c?").uniqueResult();
          ???Integer?Maxage?=?(Integer)?i?[0];
          ???Integer?Minage?=?(Integer)?i?[1];
          4'統計customer中的客戶的名稱數目,忽略重復的姓名
          ???Integer?cout?=?(Integer)?session.createQuery("select?count(distinct?c.name)?from?customer?c").uniqueResult();
          ////////////使用分組查詢
          1'按姓名分組,統計customer中的相同姓名的記錄數目
          ???Iterator?iterator?=?(Integer)?session.createQuery("select?c.name?,count(c)?from?customer?c?group?by?c.name").list.iterator();
          ???while(iterator.hasnext()){
          ?????????object[]?p?=?(objcet[])iterator.next();
          ?????????String?name?=?p[0];
          ?????????Integer?cout?=?p[1];
          ???}
          2'按客戶分組,統計每個客戶的訂單數量
          ???Iterator?iterator?=?session.crateQuery("select?c.id?,c.name?,?count(o)?from?customer?c?join?c.order?o?group?by?c.id?").list().iterator;
          ???while(iterator.hasnext()){
          ?????????object[]?p?=?(objcet[])iterator.next();
          ?????????Integer?id?=?p[0]
          ?????????String?name?=?p[1];
          ?????????Integer?cout?=?p[2];
          ???}
          3'統計每個客戶的訂單總價
          ???Iterator?iterator?=?session.crateQuery("select?c.id?,c.name,sum(o.price)?from?customer?c?join?c.order?o?group?by?c.id").list.iterator();
          ???while(iterator.hasnext()){
          ?????????object[]?p?=?(objcet[])iterator.next();
          ?????????Integer?id?=?p[0]
          ?????????String?name?=?p[1];
          ?????????Double?cout?=?p[2];
          ???}
          //////////報表的優化
          使用HQL時如果只查詢對象的一部分屬性不會返回持久化對象
          from?customer?c?join?c.order?o?group?by?c.age;//返回持久化對象,占用緩存。

          select?c.id?,?c.name?,?c.age?,o.id?,o.price?from?customer?c?join?c.order?o?group?by?c.age?//返回關系性數據,不占用session的緩存,可以為JVM回收

          /////////HQL子查詢的集合函數屬性
          size()?返回集合中元素的數目
          minIndex()?建立索引的集合獲得最小的索引
          maxIndex()?建立索引的集合獲得最大的索引
          minElement()?對于包含基本元素的集合獲得集合最小的元素
          maxElement()?對于包含基本元素的集合獲得集合最大的元素
          element()?獲得集合中的所有元素
          ///////////Hibernate的緩存管理
          管理一級緩存,不建議使用下列方法來管理一級緩存
          evict(Object?o)從緩存中清除參數指定的持久化對象
          clear()清空緩存中所有的持久化對象
          ///////////批量更新和批量刪除
          批量更新customer表中的年齡大于零的所有記錄的AGE字段:
          ????tx?=?session.beginTransaction();
          ????Iterator?customer?=?session.find("from?customer?c?where?c.age?>?0").iterator();
          ????while(iterator.hasnext()){
          ????????customer?customer?=?(customer)?customer.next();
          ????????customer.setAge(customer.getAge()+1);
          ????}
          ????tx.commit();
          ????session.close();//上述代碼對數據庫操作效果不好可以使用下列的JDBCAPI直連
          ???
          ????tx?=?session.beginTranscation();
          ????Connection?conn?=?session.connection();
          ????Preparedstatement?ps?=?conn.preparedstatment("update?customer?set?age?=?age?+?1?where?age?>?0?");
          ????ps.executeupdate();
          ????tx.commit();
          posted on 2006-06-19 14:56 Dragonofson 閱讀(7314) 評論(0)  編輯  收藏 所屬分類: Hiberbate

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 柞水县| 广平县| 巴马| 鹤山市| 凉山| 西畴县| 新竹市| 汉阴县| 云梦县| 泰顺县| 丹凤县| 鹿泉市| 清徐县| 图木舒克市| 牟定县| 鄂尔多斯市| 尉氏县| 华宁县| 班玛县| 大姚县| 太康县| 上杭县| 历史| 汕尾市| 青阳县| 酉阳| 青川县| 获嘉县| 东乌| 天全县| 陈巴尔虎旗| 潜山县| 瓮安县| 平遥县| 建湖县| 北碚区| 二手房| 昌图县| 涪陵区| 肇庆市| 衡阳县|