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

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

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

    太陽(yáng)雨

    痛并快樂(lè)著

    BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
      67 Posts :: 3 Stories :: 33 Comments :: 0 Trackbacks

    本節(jié)講述如何使用Hibernate實(shí)現(xiàn)記錄的增、刪、改和查功能。

    1 查詢

           Hibernate中使用查詢時(shí),一般使用Hql查詢語(yǔ)句。

    HQLHibernate Query Language),即Hibernate的查詢語(yǔ)言跟SQL非常相像。不過(guò)HQLSQL的最根本的區(qū)別,就是它是面向?qū)ο蟮摹?/span>

    使用HQL時(shí)需要注意以下幾點(diǎn):

    l         大小寫敏感

    因?yàn)?/span>HQL是面向?qū)ο蟮?,而?duì)象類的名稱和屬性都是大小寫敏感的,所以HQL是大小寫敏感的。

    Eg.

    HQL語(yǔ)句:from Cat as cat where cat.id > 1;from Cat as cat where cat.ID > 1;是不一樣的,這點(diǎn)與SQL不同。

    l         from子句

    Eg. from Cat,該句返回Cat對(duì)象實(shí)例,開發(fā)人員也可以給其加上別名,eg. from Cat as cat,對(duì)于多表查詢的情況,可參考如下:

    from Cat as cat, Dog as dog

    其它方面都與SQL類似,在此不再贅述。

    接下來(lái)講一個(gè)在Hibernate中查詢的例子。

    1.1簡(jiǎn)單查詢

    List list = session.createQuery("from User as user order by user.loginName").list();

    1.2帶單個(gè)參數(shù)的查詢

    List list = session.find("from User as user where user.loginName=?",

                                                              loginName,

                                                              Hibernate.STRING);

    1.3多個(gè)參數(shù)的查詢

    Eg1. 此例采用“?”占位符的方式

    String hql = "from User as user where user.loginName=? and user.orgId=? ";

    Query query = session.createQuery(hql);

    query.setParameter(1, 'amigo');

    query.setParameter(2, new Long(1)) ;

    List list = query .list();

    Eg2. 此例采用“:paramName”的方式

    String hql = "from User as user where user.loginName=:loginName and user.orgId=:orgId ";

    Query query = session.createQuery(hql);

    query.setParameter('loginName', 'amigo');

    query.setParameter('orgId', new Long(1)) ;

    List list = query .list();

    1.4查詢數(shù)量

    int count  = (Integer) session.createQuery("select count(*) from User").uniqueResult().intValue();

    1.5限制查詢起始值和數(shù)量的查詢

    這種一般是在記錄需要分頁(yè)的時(shí)候需要用到,例如,在如下的代碼中,限制查詢的開始記錄的位置為50,最大查詢條數(shù)為50。

    String hql = "from User as user order by user.loginName";

    int firstResult= 50;

    int maxResults = 50;

    Query query = session.createQuery(hql);

    query = query.setFirstResult(firstResult);

    query.setMaxResults(maxResults);

    1.6子查詢

    在某些情況下,也需要用到子查詢,例如在下面的例子中,User為用戶對(duì)象,UserRole為用戶與角色關(guān)聯(lián)對(duì)象。如下HQL語(yǔ)句將沒(méi)有分配角色的用戶對(duì)象查找出來(lái)。

    String hql = "from User user where user.loginName"

    + " not in(select ur.user.loginName from UserRole ur) ";

    List list = (session.createQuery(hql)).list();

    1.7原生SQL查詢

    對(duì)于某些復(fù)雜的查詢語(yǔ)句,需要調(diào)用某種特定的數(shù)據(jù)庫(kù)的特定函數(shù)才能解決,Hibernate雖然不推薦使用原生SQL語(yǔ)句來(lái)查詢,因?yàn)檫@將破壞數(shù)據(jù)庫(kù)的易移植性,但是Hibernate中也提供了使用原生SQL進(jìn)行查詢的方法,只需要獲得連接即可。

    Eg. 在下面的例子中,用到了Sql Server數(shù)據(jù)庫(kù)中的原生sql語(yǔ)句,如下所示:

    String timeUnit = "13";

    String sql = "select count(*) count, CONVERT(VARCHAR(" + timeUnit +"),  log.gen_datetime,121) timeUnit " + "from Log log";

    SQLQuery query = session.createSQLQuery(sql)

    .addScalar("count", Hibernate.INTEGER)

    .addScalar("timeUnit", Hibernate.STRING);

    List list = query.list();

    2 新增

           在數(shù)據(jù)庫(kù)中新增記錄在Hibernate中不需要使用insert命令,只需要構(gòu)造新增的對(duì)象后,調(diào)用Session對(duì)象的save(…)方法即可。

    2.1新增單個(gè)對(duì)象

           新增單個(gè)對(duì)象的實(shí)例如下,該實(shí)例將在用戶表中新增一條記錄。

    Session session = HibernateSessionFactory.getSession();

             Transaction ts = null;

    try {

    ts = session.beginTransaction();

                      User user = new User();

                      user.setLoginName("amigo");

                      user.setFullName("阿蜜果");

                      ……

                      session.save(user) ;

                       ts.commit();

    } catch (Exception e) {

                      if (ts != null) {

    ts.rollback();

    }

    } finally {

                       HibernateSessionFactory.closeSession();

    }

    2.2批量新增對(duì)象

    對(duì)于批量新增對(duì)象的情況,需要在新增一部分對(duì)象后flushclear一次,例如,沒(méi)批量新增20個(gè)對(duì)象時(shí)手動(dòng)的flush一次,假設(shè)在list為一個(gè)用戶列表,里面包含很多User對(duì)象,那么要將實(shí)現(xiàn)這些對(duì)象的批量新增,可采用如下方法:

    Session session = HibernateSessionFactory.getSession();

    Transaction ts = null;

    try {

    ts = session.beginTransaction();

    for (int i = 0; i < list.size(); i++) {

                                User user = (User) list.get(i);

                                session.save(user) ;

                                if (i % 20 == 0) {

             session.flush();

             session.clear();

    }

                       }

                       ts.commit();

    } catch (Exception e) {

                       if (ts != null) {

    ts.rollback();

    }

    } finally {

                       HibernateSessionFactory.closeSession();

    }

    3 更新

           hibernate中,更新對(duì)象前不需要使用查詢語(yǔ)句:update…,一般需要在取得需要更新的持久化對(duì)象后,執(zhí)行Session對(duì)象的update(…)方法。例如:

    Session session = HibernateSessionFactory.getSession();

    Transaction ts = null;

    try {

    ts = session.beginTransaction();

    //取得持久化對(duì)象

                       User user = session.get(User.class, "amigo");

                       //對(duì)需要修改的屬性進(jìn)行修改

                       user.setFullName("阿蜜果");

                       ……

                       session.update(user) ;

                       ts.commit();

    } catch (Exception e) {

                       if (ts != null) {

    ts.rollback();

    }

    } finally {

                      HibernateSessionFactory.closeSession();

    }

    4 刪除

    4.1刪除單個(gè)對(duì)象

           一般在取得某對(duì)象后,開發(fā)人員可以調(diào)用Session對(duì)象的delete(…)方法刪除該對(duì)象。

    Eg. 下面的實(shí)例中取得loginName(主鍵)為“amigo”的User對(duì)象后,將它刪除。

    Session session = HibernateSessionFactory.getSession();

    Transaction ts = null;

    try {

    ts = session.beginTransaction();

    //取得持久化對(duì)象

                       User user = session.get(User.class, "amigo");

                       session.delete(user) ;

                       ts.commit();

    } catch (Exception e) {

                       if (ts != null) {

    ts.rollback();

    }

    } finally {

                       HibernateSessionFactory.closeSession();

    }

    4.2批量刪除對(duì)象

    對(duì)于批量刪除對(duì)象的情況,開發(fā)人員可以在取得待刪除的對(duì)象列表后,一個(gè)一個(gè)的將對(duì)象刪除,對(duì)于每個(gè)對(duì)象的刪除方法,見3.4.1小節(jié)。開發(fā)人員還可以hql語(yǔ)句來(lái)做批量刪除。

    Eg. 該實(shí)例通過(guò)delete語(yǔ)句來(lái)刪除記錄,除了loginName為“amigo”的對(duì)象為,其余都刪除,代碼如下所示:

    Session session = HibernateSessionFactory.getSession();

    Transaction ts = null;

    try {

    ts = session.beginTransaction();

    String hql = "delete User as user where user.loginName != 'amigo'";

    Query query = session.createQuery(hql);

    int count  = query.executeUpdate();

     ts.commit();

    System.out.println("delete count : " + count); //刪除條數(shù)

    } catch (Exception e) {

                       if (ts != null) {

    ts.rollback();

    }

    } finally {

                       HibernateSessionFactory.closeSession();

    }

    posted on 2008-10-21 14:29 小蟲旺福 閱讀(216) 評(píng)論(0)  編輯  收藏 所屬分類: hibernate相關(guān)
    主站蜘蛛池模板: 久久免费视频精品| 国产伦一区二区三区免费 | 亚洲一级免费视频| 亚洲日韩精品A∨片无码加勒比| 精品国产免费一区二区| 国产免费A∨在线播放| 久久国产亚洲精品无码| 国产免费私拍一区二区三区| 韩日电影在线播放免费版| 亚洲五月综合网色九月色| 国产精品亚洲综合专区片高清久久久| 99re热精品视频国产免费| 国产亚洲视频在线| 亚洲精品第五页中文字幕| 国产gav成人免费播放视频| 99精品在线免费观看| 黄色三级三级三级免费看| 亚洲黄色免费网站| 亚洲国产成人VA在线观看| 亚洲高清中文字幕免费| 二区久久国产乱子伦免费精品| 亚洲一级黄色大片| 亚洲人成中文字幕在线观看| 啦啦啦www免费视频| 久久精品免费视频观看| 日韩大片在线永久免费观看网站| 亚洲国语在线视频手机在线| 激情综合色五月丁香六月亚洲| 毛片在线看免费版| 99在线观看免费视频| 一级成人生活片免费看| 亚洲第一综合天堂另类专 | 亚洲精品国产成人专区| 亚洲国产精品无码久久青草| 99久久免费国产精品特黄| 国产成人AV片无码免费| 日韩电影免费在线观看网址| 亚洲欧洲日产国码久在线| 亚洲最大视频网站| 久久久久亚洲av无码专区蜜芽| 亚洲免费无码在线|