【Hibernate總結系列】使用舉例

           

          本節講述如何使用Hibernate實現記錄的增、刪、改和查功能。

          1 查詢

                 Hibernate中使用查詢時,一般使用Hql查詢語句。

          HQLHibernate Query Language),即Hibernate的查詢語言跟SQL非常相像。不過HQLSQL的最根本的區別,就是它是面向對象的。

          使用HQL時需要注意以下幾點:

          l         大小寫敏感

          因為HQL是面向對象的,而對象類的名稱和屬性都是大小寫敏感的,所以HQL是大小寫敏感的。

          Eg.

          HQL語句:from Cat as cat where cat.id > 1;from Cat as cat where cat.ID > 1;是不一樣的,這點與SQL不同。

          l         from子句

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

          from Cat as cat, Dog as dog

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

          接下來講一個在Hibernate中查詢的例子。

          1.1簡單查詢

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

          1.2帶單個參數的查詢

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

                                                                    loginName,

                                                                    Hibernate.STRING);

          1.3多個參數的查詢

          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查詢數量

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

          1.5限制查詢起始值和數量的查詢

          這種一般是在記錄需要分頁的時候需要用到,例如,在如下的代碼中,限制查詢的開始記錄的位置為50,最大查詢條數為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為用戶對象,UserRole為用戶與角色關聯對象。如下HQL語句將沒有分配角色的用戶對象查找出來。

          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查詢

          對于某些復雜的查詢語句,需要調用某種特定的數據庫的特定函數才能解決,Hibernate雖然不推薦使用原生SQL語句來查詢,因為這將破壞數據庫的易移植性,但是Hibernate中也提供了使用原生SQL進行查詢的方法,只需要獲得連接即可。

          Eg. 在下面的例子中,用到了Sql Server數據庫中的原生sql語句,如下所示:

          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 新增

                 在數據庫中新增記錄在Hibernate中不需要使用insert命令,只需要構造新增的對象后,調用Session對象的save(…)方法即可。

          2.1新增單個對象

                 新增單個對象的實例如下,該實例將在用戶表中新增一條記錄。

          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批量新增對象

          對于批量新增對象的情況,需要在新增一部分對象后flushclear一次,例如,沒批量新增20個對象時手動的flush一次,假設在list為一個用戶列表,里面包含很多User對象,那么要將實現這些對象的批量新增,可采用如下方法:

          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中,更新對象前不需要使用查詢語句:update…,一般需要在取得需要更新的持久化對象后,執行Session對象的update(…)方法。例如:

          Session session = HibernateSessionFactory.getSession();

          Transaction ts = null;

          try {

          ts = session.beginTransaction();

          //取得持久化對象

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

                             //對需要修改的屬性進行修改

                             user.setFullName("阿蜜果");

                             ……

                             session.update(user) ;

                             ts.commit();

          } catch (Exception e) {

                             if (ts != null) {

          ts.rollback();

          }

          } finally {

                            HibernateSessionFactory.closeSession();

          }

          4 刪除

          4.1刪除單個對象

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

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

          Session session = HibernateSessionFactory.getSession();

          Transaction ts = null;

          try {

          ts = session.beginTransaction();

          //取得持久化對象

                             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批量刪除對象

          對于批量刪除對象的情況,開發人員可以在取得待刪除的對象列表后,一個一個的將對象刪除,對于每個對象的刪除方法,見3.4.1小節。開發人員還可以hql語句來做批量刪除。

          Eg. 該實例通過delete語句來刪除記錄,除了loginName為“amigo”的對象為,其余都刪除,代碼如下所示:

          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); //刪除條數

          } catch (Exception e) {

                             if (ts != null) {

          ts.rollback();

          }

          } finally {

                             HibernateSessionFactory.closeSession();

          }

          http://www.aygfsteel.com/amigoxie/archive/2008/01/01/171972.html

          posted on 2008-11-15 21:58 smallfa 閱讀(262) 評論(0)  編輯  收藏 所屬分類: hibernate/ibatis

          <2008年11月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導航

          統計

          公告

          smallfa
          博客園
          C++博客
          博客生活
          Blogjava
          足球博客
          微博
          Redsaga

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          相冊

          Ajax

          Blogs

          DB

          java

          Open source

          ORM

          Tools/Help

          vedio Tech

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 梁平县| 阳曲县| 岳阳市| 西昌市| 稷山县| 东兰县| 九寨沟县| 姜堰市| 永定县| 象州县| 惠东县| 新乡市| 伽师县| 龙井市| 英山县| 英德市| 金寨县| 佛山市| 禹州市| 崇明县| 彝良县| 万山特区| 易门县| 许昌县| 虎林市| 城市| 西充县| 巩义市| 玉树县| 新蔡县| 彰武县| 罗江县| 龙胜| 冷水江市| 兴和县| 阳西县| 长葛市| 富顺县| 水富县| 亚东县| 石阡县|