<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

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

    主站蜘蛛池模板: 久久午夜夜伦鲁鲁片免费无码影视| 亚洲av无码一区二区三区四区| 国产精品福利片免费看| 免费v片视频在线观看视频| 亚洲av无码专区在线电影天堂 | 免费a级毛片高清视频不卡| 亚洲福利秒拍一区二区| 美女内射毛片在线看免费人动物| 亚洲精品自拍视频| 999在线视频精品免费播放观看| 亚洲youjizz| 国产精品无码素人福利免费| 国产亚洲综合一区二区三区| 免费一看一级毛片全播放| 七次郎成人免费线路视频| 亚洲综合色在线观看亚洲| 日本一区午夜艳熟免费| 亚洲AV本道一区二区三区四区| 在线观看免费中文视频| 亚洲人成电影网站| 免费人成视频在线观看视频| xxxxx做受大片在线观看免费| 亚洲精品国产精品乱码不卡√| 日韩精品极品视频在线观看免费| 亚洲男人的天堂久久精品| 在线观看国产情趣免费视频| 一区二区三区免费视频播放器 | 亚洲美女激情视频| 韩国日本好看电影免费看| 男女啪啪免费体验区| 亚洲国产精品久久久久婷婷老年| 91九色精品国产免费| 色一情一乱一伦一视频免费看| 亚洲熟妇丰满多毛XXXX| 免费能直接在线观看黄的视频| 亚洲人成网亚洲欧洲无码| 亚洲精品国产精品乱码不卞| 99久久国产免费中文无字幕| 亚洲乱码日产精品一二三| 亚洲精品白浆高清久久久久久| 亚洲一区二区三区免费观看|