和風細雨

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

          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 和風細雨 閱讀(6702) 評論(1)  編輯  收藏 所屬分類: Hibernate

          評論

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

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

          主站蜘蛛池模板: 嘉义县| 哈巴河县| 舟山市| 甘洛县| 太康县| 临洮县| 河西区| 宁南县| 遂宁市| 咸宁市| 奉节县| 江川县| 连山| 永靖县| 余干县| 姜堰市| 鞍山市| 嘉兴市| 白山市| 唐山市| 萨嘎县| 大埔县| 信阳市| 卓资县| 吐鲁番市| 红原县| 商河县| 仲巴县| 定州市| 双流县| 和静县| 台州市| 大新县| 阜新| 南靖县| 安阳市| 石泉县| 历史| 大宁县| 临泉县| 阿鲁科尔沁旗|