<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    和風細雨

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

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

    評論

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

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

    主站蜘蛛池模板: 亚洲日韩乱码中文无码蜜桃臀网站| 国产aⅴ无码专区亚洲av麻豆| 亚洲精品国产精品国自产观看| 久久久久久亚洲av成人无码国产| 2020国产精品亚洲综合网| 成年免费大片黄在线观看com| **真实毛片免费观看 | 好爽又高潮了毛片免费下载| 亚洲区小说区图片区| 亚洲卡一卡2卡三卡4麻豆| 国产高潮久久免费观看| 114一级毛片免费| 亚洲精品美女久久777777| 亚洲欧美黑人猛交群| 无码日韩精品一区二区三区免费| 国产自产拍精品视频免费看| 亚洲男人都懂得羞羞网站| 男性gay黄免费网站| 91频在线观看免费大全| 亚洲国产精品一区二区第一页 | 亚洲色一区二区三区四区| 国产啪精品视频网站免费尤物 | 添bbb免费观看高清视频| 91手机看片国产永久免费| 黑人精品videos亚洲人| 精品无码专区亚洲| 波多野结衣免费在线观看| 亚洲AV日韩AV高潮无码专区| 免费大片av手机看片| 最近最新的免费中文字幕| 亚洲综合精品一二三区在线| 四虎影视久久久免费观看| 四虎www成人影院免费观看| 亚洲国产一区在线| 亚欧乱色国产精品免费视频| 成人国产mv免费视频| 中文无码亚洲精品字幕| 最近免费视频中文字幕大全| 亚洲色欲久久久综合网| 人体大胆做受免费视频| 国产免费人成视频在线观看|