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

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

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

    和風(fēng)細(xì)雨

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

    Hibernate之HQL

    HQL介紹

    Hibernate中不使用SQL而是有自己的面向?qū)ο蟛樵冋Z言,該語言名為Hibernate查詢語言(Hibernate Query Language).HQL被有意設(shè)計(jì)成類似SQL,這樣開發(fā)人員可以利用已有的SQL知識(shí),降低學(xué)習(xí)坡度.它支持常用的SQL特性,這些特性被封裝成面向?qū)ο蟮牟樵冋Z言,從某種意義上來說,由HQL是面向?qū)ο蟮?因此比SQL更容易編寫.
    本文將逐漸介紹HQL的特性.

    查詢數(shù)據(jù)庫中所有實(shí)例

    要得到數(shù)據(jù)庫中所有實(shí)例,HQL寫為”from 對(duì)象名”即可,不需要select子句,當(dāng)然更不需要Where子句.代碼如右.

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

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


    限制返回的實(shí)例數(shù)

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

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

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

    分頁查詢

    分頁是Web開發(fā)的常見課題,每種數(shù)據(jù)庫都有自己特定的分頁方案,從簡單到復(fù)雜都有.在Hibernate中分頁問題可以通過設(shè)置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實(shí)例數(shù)為"+users.size());
    for(User user:users){
          System.out.println(user);
    }

    條件查詢

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

    Hibernate中條件查詢的實(shí)現(xiàn)方式有多種,這種方式的優(yōu)點(diǎn)在于能顯示完整的SQL語句(包括參數(shù))如下.

    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實(shí)例數(shù)為"+users.size());
      for(User user:users){
        System.out.println(user);
      }
         
          HibernateUtil.closeSession(session);
    }

    位置參數(shù)條件查詢

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


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

    命名參數(shù)條件查詢

    使用位置參數(shù)條件查詢最大的不便在于下標(biāo)與?號(hào)位置的對(duì)應(yīng)上,如果參數(shù)較多容易導(dǎo)致錯(cuò)誤.這時(shí)采用命名參數(shù)條件查詢更好.
    使用命名參數(shù)時(shí)無需知道每個(gè)參數(shù)的索引位置,這樣就可以節(jié)省填充查詢參數(shù)的時(shí)間.

    如果有一個(gè)命名參數(shù)出現(xiàn)多次,那在每個(gè)地方都會(huì)設(shè)置它.

    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實(shí)例數(shù)為"+users.size());
      for(User user:users){
        System.out.println(user);
      }
         
          HibernateUtil.closeSession(session);
    }

    命名查詢

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

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

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

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


    映射文件節(jié)選:
    <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 和風(fēng)細(xì)雨 閱讀(6695) 評(píng)論(1)  編輯  收藏 所屬分類: Hibernate

    評(píng)論

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

    非常明了
    謝謝 頂頂頂  回復(fù)  更多評(píng)論   

    主站蜘蛛池模板: 2021国产精品成人免费视频| 日本人护士免费xxxx视频| 亚洲深深色噜噜狠狠网站| 日韩免费观看一级毛片看看| 国产97视频人人做人人爱免费| 久久丫精品国产亚洲av| 国产免费变态视频网址网站| 免费无码A片一区二三区| 美女被爆羞羞网站在免费观看| 亚洲AV无码1区2区久久| 日韩一品在线播放视频一品免费| 国产精品免费大片一区二区| 91亚洲精品自在在线观看| 黄色永久免费网站| 免费人成动漫在线播放r18 | 亚洲已满18点击进入在线观看| 国产成人亚洲精品91专区手机| 99精品视频免费在线观看| 亚洲成Av人片乱码色午夜| 免费特级黄毛片在线成人观看| 亚洲国产精品美女久久久久| 亚洲精品无码久久久影院相关影片 | 希望影院高清免费观看视频| 一区二区三区在线观看免费| 国产亚洲福利在线视频| 人人狠狠综合久久亚洲婷婷| 国产精品色午夜视频免费看| 69视频在线观看免费| 国产精品免费视频观看拍拍| 亚洲精品无码你懂的| 久久亚洲日韩看片无码| 77777亚洲午夜久久多人| 免费黄网在线观看| 免费观看的毛片大全| 亚欧日韩毛片在线看免费网站| 无人视频免费观看免费视频| 亚洲中文字幕精品久久| 亚洲网站免费观看| 亚洲2022国产成人精品无码区| 国产亚洲AV手机在线观看| 免费很黄很色裸乳在线观看|