和風細雨

          世上本無難事,心以為難,斯乃真難。茍不存一難之見于心,則運用之術自出。

          導航

          <2008年4月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          統計

          常用鏈接

          留言簿(9)

          隨筆分類

          隨筆檔案

          文章檔案

          相冊

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          Hibernate之HQL

          HQL介紹

          Hibernate中不使用SQL而是有自己的面向對象查詢語言,該語言名為Hibernate查詢語言(Hibernate Query Language).HQL被有意設計成類似SQL,這樣開發人員可以利用已有的SQL知識,降低學習坡度.它支持常用的SQL特性,這些特性被封裝成面向對象的查詢語言,從某種意義上來說,由HQL是面向對象的,因此比SQL更容易編寫.
          本文將逐漸介紹HQL的特性.

          查詢數據庫中所有實例

          要得到數據庫中所有實例,HQL寫為”from 對象名”即可,不需要select子句,當然更不需要Where子句.代碼如右.

          Query query=session.createQuery("from User");
          List<User> users=(List<User>)query.list();

          for(User user:users){
               System.out.println(user);
          }


          限制返回的實例數

          設置查詢的maxResults屬性可限制返回的實例(記錄)數,代碼如右:

          Query query=session.createQuery("from User order by name");
          query.setMaxResults(5);
          List<User> users=(List<User>)query.list();

          System.out.println("返回的User實例數為"+users.size());
          for(User user:users){
           System.out.println(user);
          }

          分頁查詢

          分頁是Web開發的常見課題,每種數據庫都有自己特定的分頁方案,從簡單到復雜都有.在Hibernate中分頁問題可以通過設置firstResult和maxResult輕松的解決.

          代碼如右:

          Query query=session.createQuery("from User order by name");
          query.setFirstResult(3);
          query.setMaxResults(5);
          List<User> users=(List<User>)query.list();

          System.out.println("返回的User實例數為"+users.size());
          for(User user:users){
                System.out.println(user);
          }

          條件查詢

          條件查詢只要增加Where條件即可.
          代碼如右:

          Hibernate中條件查詢的實現方式有多種,這種方式的優點在于能顯示完整的SQL語句(包括參數)如下.

          select
              user0_.ID as ID0_,
              user0_.name as name0_,
              user0_.pswd as pswd0_,
              user0_.email as email0_,
              user0_.lastLoginTime as lastLogi5_0_,
              user0_.lastLoginIp as lastLogi6_0_
          from
              USERTABLE_OKB user0_
          where
              user0_.name like '何%'

          public static void fetchByName(String prefix){
            Session session=HibernateUtil.getSession();
           
            Query query=session.createQuery("from User where name like'"+prefix+"%'");
            List<User> users=(List<User>)query.list();
           
            System.out.println("返回的User實例數為"+users.size());
            for(User user:users){
              System.out.println(user);
            }
               
                HibernateUtil.closeSession(session);
          }

          位置參數條件查詢

          HQL中也可以象jdbc中PreparedStatement一樣為SQL設定參數,但不同的是下標從0開始.
          代碼如右:


          public static void fetchByPos(String prefix){
            Session session=HibernateUtil.getSession();
           
            Query query=session.createQuery("from User where name=?");
            // 注意下標是從0開始,和jdbc中PreparedStatement從1開始不同
            query.setParameter(0, prefix);
            List<User> users=(List<User>)query.list();
           
            System.out.println("返回的User實例數為"+users.size());
            for(User user:users){
              System.out.println(user);
            }
               
                HibernateUtil.closeSession(session);
          }

          命名參數條件查詢

          使用位置參數條件查詢最大的不便在于下標與?號位置的對應上,如果參數較多容易導致錯誤.這時采用命名參數條件查詢更好.
          使用命名參數時無需知道每個參數的索引位置,這樣就可以節省填充查詢參數的時間.

          如果有一個命名參數出現多次,那在每個地方都會設置它.

          public static void fetchByNamedParam(){
            Session session=HibernateUtil.getSession();
           
            Query query=session.createQuery("from User where name=:name");
            query.setParameter("name", "李白");
            List<User> users=(List<User>)query.list();
           
            System.out.println("返回的User實例數為"+users.size());
            for(User user:users){
              System.out.println(user);
            }
               
                HibernateUtil.closeSession(session);
          }

          命名查詢

          命名查詢是嵌在XML映射文件中的查詢。通常,將給定對象的所有查詢都放在同一文件中,這種方式可使維護相對容易些。命名查詢語句寫在映射定義文件的最后面。

          執行代碼如下:
          Session session=HibernateUtil.getSession();

          Query query=session.getNamedQuery("user.sql");
          List<User> users=(List<User>)query.list();

          System.out.println("返回的User實例數為"+users.size());
          for(User user:users){
            System.out.println(user);
          }
             
          HibernateUtil.closeSession(session);


          映射文件節選:
          <hibernate-mapping package="org.hibernate.auction">
            <class name="com.sitinspring.domain.User"
              table="USERTABLE_OKB" lazy="false">
              <id name="id" column="ID" >
                <generator class="uuid.hex"/>
              </id>
              <property name="name" column="name" />
              <property name="password" column="pswd" />
              <property name="email" column="email" />
              <property name="lastLoginTime" column="lastLoginTime" />
              <property name="lastLoginIp" column="lastLoginIp" />
            </class>
           
            <query name="user.sql">
              <![CDATA[from User where email='2@2.3']]>
            </query>
          </hibernate-mapping>

          posted on 2008-04-30 16:55 和風細雨 閱讀(6704) 評論(1)  編輯  收藏 所屬分類: Hibernate

          評論

          # re: Hibernate之HQL 2008-06-17 09:29 leekoob

          非常明了
          謝謝 頂頂頂  回復  更多評論   

          主站蜘蛛池模板: 驻马店市| 黔江区| 金塔县| 古田县| 呼玛县| 班戈县| 藁城市| 三门县| 老河口市| 邮箱| 威宁| 本溪市| 虹口区| 阿拉善左旗| 会理县| 蓬安县| 宁阳县| 启东市| 合水县| 湖南省| 通辽市| 博乐市| 来宾市| 姚安县| 长寿区| 武乡县| 兴宁市| 建平县| 广河县| 石家庄市| 若羌县| 诏安县| 湟中县| 保定市| 溆浦县| 澄江县| 常州市| 沛县| 东辽县| 马鞍山市| 周宁县|