隨筆 - 0, 文章 - 75, 評論 - 0, 引用 - 0
          數據加載中……

          HQL實用技術

          Hibernate
          支持兩種主要的查詢方式
          HQL(Hibernate Query Languge,Hibernate
          查詢語言)查詢
          是一種面向對象的查詢語言,其中沒有表和字段的概念,只有類、對象和屬性的概念
          HQL 是應用較為廣泛的方式
          Criteria
          查詢
          又稱為“對象查詢”,它用面向對象的方式將構造查詢的過程做了封裝



          使用HQL 可以避免使用JDBC
          查詢的一些弊端
          不需要再編寫繁復的SQL 語句,針對實體類及其屬性進行查詢
          查詢結果是直接存放在List
          中的對象,不需要再次封裝
          獨立于數據庫,對不同的數據庫根據Hibernate dialect 屬性的配置自動生成不同的SQL
          語句執行



          語法:


          [select/update/delete……]
          from
          Entity
          [where……]
          [group by……] [having……] [order by……]



          使用HQL需要四步:
          得到Session
          編寫HQL語句

          創建Query對象
          Query接口是HQL 查詢接口。它提供了各種的查詢功能

          執行查詢,得到結果



          設置別名(alias)


          from Street as s 或 from street s
          s 是Street 的別名,通過as 關鍵字指定,關鍵字as
          是可選的


          //
          省略部分代碼


          try
          {


          sessionFactory
          =


          new
          Configuration().configure().
          buildSessionFactory();


          session
          =
          sessionFactory.openSession();



          String
          hql
          =
          from
          Street
          ”;


          Query
          query
          =
          session.createQuery(hql);


          List<Street>
          list =
          query.list();



          for(Street
          street:list){



          System.out.println("街道名稱
          "
          +



          street.getDistrict().getName()+""
          +
          street.getName());



          }


          }
          catch (
          HibernateException
          e)
          {


          e.printStackTrace();


          }
          finally{



          //
          省略部分代碼


          }



          where
          子句指定限定條件

          通過與SQL
          相同的比較操作符指定條件

          如:

          ==<><>>=<=

          betweennot
          between

          innot
          in

          islike

          通過andor
          等邏輯連接符組合各個邏輯表達式



          //省略代碼


          String
          hql
          ="from
          Street as s
          where
          s.name='中關村大街'";


          Query
          query
          =
          session.createQuery(hql);


          List
          userList
          =
          query.list();


          //省略代碼



          查詢實體對象的某個屬性(數據庫表中的某個字段信息)


          String
          hql
          ="select
          u.password
          from
          User as u where u.name='admin'";



          獲取實體的多個屬性


          String
          hql
          ="select
          u.id,u.password
          from
          User as u where u.name='admin'";



          獲取屬性類型


          //省略代碼


          String
          hql
          ="select
          u.id from
          User
          as
          u
          where
          user.name='admin'";


          Query
          query
          =
          session.createQuery(hql);


          List
          list
          =
          query.list();


          Iterator
          it
          =
          list.iterator();


          if(it.hasNext()){


          System.out.println("id
          的類型為
          :"+
          it.next().getClass());


          }



          參數綁定


          "?"占位符

          使用“?”作占位符,可以先設定查詢參數

          通過setType()方法設置指定的參數

          必須保證每個占位符都設置了參數值

          必須依照“?”所設定順序設定

          下標從0開始,而不是使用PreparedStatement
          對象時的從1開始


          //省略代碼


          String
          hql
          ="select
          u.password
          from
          User as u where u.name =
          ?";


          Query
          query
          =
          session.createQuery(hql);


          query.setString(0,
          "admin");


          //省略代碼




          命名參數

          :name
          即命名參數

          標識了一個名為“name”的查詢參數

          根據此參數名進行參數值設定

          不需要依照特定的順序


          //省略代碼


          String
          hql
          ="select
          u.password
          from
          User as u where u.name=
          :name";


          Query
          query
          =
          session.createQuery(hql);


          query.setString("name",
          "admin");


          //省略代碼



          封裝參數

          動態設置查詢參數

          將參數封裝為一個bean

          通過Query
          對象的setProperties(Object
          bean)
          實現參數的設定

          public
          class
          QueryProperties
          {


          private
          String title;
          //
          標題


          private
          Double
          high_price;
          //
          價格最高值


          private
          Double
          low_price;
          //
          價格最低值


          private
          String
          type_id;
          //
          房屋類型編號


          private
          String
          street_id;
          //
          街道編號


          private
          Integer
          small_floorage;
          //
          面積最小值


          private
          Integer
          big_floorage; //面積最大值


          //省略setter
          getter
          方法


          }


          StringBuffer
          queryString
          =
          new
          StringBuffer();


          queryString.append("from
          House where ");


          queryString.append("(title
          like :title) ");


          queryString.append("and
          (
          street_id
          like
          :
          street_id)
          ");


          queryString.append("and
          (
          type_id
          like
          :
          type_id)
          ");


          queryString.append("and
          (price between :
          low_price
          and
          :
          high_price)
          ");


          queryString.append("and(floorage
          between :
          small_floorage
          and
          :
          big_floorage)
          ");



          //
          省略部分代碼


          Query
          query
          =
          session.createQuery(queryString.toString());


          query.setProperties(qp);


          List<House>
          list =
          query.list();


          //
          省略部分代碼



          HQL
          常用聚合函數

          count(
          )
          :統計函數


          select
          count(house)
          from House h where
          h.user_id
          =
          '1010'



          max(
          )
          min(
          )
          :最大值和最小值函數


          select
          max(h.price),min(h.price)
          from House h



          avg(
          )
          sum(
          )
          :平均值和求和函數


          select
          avg(h.price),sum(h.floorage)
          from House h where
          h.user_id=
          '1000'




          SQL類似,HQL
          通過order
          by
          子句實現對查詢結果的排序


          默認情況下按升序順序排序


          排序策略(asc
          升序、desc
          降序)


          from
          House
          house
          order
          by
          house.price


          from
          House
          house
          order
          by
          house.price
          desc


          from
          House
          house
          order
          by
          house.price
          ,
          house.floorage





          分組


          通過group
          by
          子句實現


          并使用having
          子句對group
          by
          返回的結果集進行篩選


          select
          sum(
          house.floorage)
          from House
          house
          group
          by
          house.street_id
          having
          sum(house.floorage)
          > 1000



          分頁


          Query對象提供了簡便的分頁方法


          setFirstResult(int
          firstResult)方法



          設置第一條記錄的位置


          setMaxResults(int
          maxResults)方法



          設置最大返回的記錄條數



          //
          省略部分代碼


          query.setFirstResult((pageIndex-1)*pageSize);


          query.setMaxResults(pageSize);


          List
          result=
          query.list();



          總結


          Hibernate主要提供哪兩種數據查詢方式?


          為什么使用HQL?


          HQL查詢參數綁定有幾種方式?


          HQL常用的聚合函數有哪些?


          Hibernate如何實現分頁?




          備注:


          HQL屬性優先查詢(如果是不寫u.*)
          優先級:屬性-->字段


          select u.name from User u


          select name from User u



          "?"占位符,使用query.setXXX() 或
          setParameter()方法都可以填充


           



          posted on 2012-04-22 15:51 hantai 閱讀(77) 評論(0)  編輯  收藏


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


          網站導航:
           
          主站蜘蛛池模板: 马山县| 湖州市| 砚山县| 忻州市| 临江市| 合江县| 乃东县| 深泽县| 封丘县| 定襄县| 长春市| 桐柏县| 定结县| 工布江达县| 茶陵县| 怀柔区| 宝坻区| 军事| 石林| 元江| 涪陵区| 梅州市| 新乡县| 永州市| 惠安县| 普兰店市| 峨山| 新田县| 曲周县| 敦煌市| 灵川县| 河间市| 龙陵县| 年辖:市辖区| 寿光市| 永年县| 无锡市| 宜丰县| 商洛市| 大名县| 左云县|