Enjoying Life ...... !
          If u can look into my eyes, u will see how beautiful the life is.
          posts - 4,comments - 12,trackbacks - 0

          本文中的功能僅存在于hibernate3中。參考文件hibernate3源代碼中的org.hibernate.test.hql包下的BulkManipulationTest.java

          hibernate2中對(duì)于批量操作的處理方法是,查詢得到所有符合條件的數(shù)據(jù)庫(kù)數(shù)據(jù)的主鍵,然后對(duì)根據(jù)主鍵對(duì)每條數(shù)據(jù)進(jìn)行操作。這樣感覺既費(fèi)時(shí)又費(fèi)力。最新Hibernate3中提供批量更新操作功能。例如:

          String hqlUpdate = “ UPDATE user u “+
          “ SET u.username
          =:newUsername, u.password=:newPassword ”+
          “ WHERE u.username
          =:username and u.password=:password “;
          Query query 
          = session.createQuery(hqlUpdate);
          query.setString(
          "username",”hfm”);
          query.setString(
          "password",”1”);
          query.setString(
          "newUsername",”ps”);
          query.setString(
          "newPassword",”123”);
          int num = query.executeUpate();
          ts.commit();

          String hqlDelete = “ DELETE FROM user u “+
          “ WHERE u.username
          =:username and u.password=:password “;
          query.setString(
          "username",”ps”);
          query.setString(
          "password",”123”);
          int num = query.executeUpate();
          ts.commit();

          變量session的類型為org.hibernate.Session;ts的類行為為org.hibernate.Transaction;返回值num表示有幾條數(shù)據(jù)被操作了。以上兩段代碼執(zhí)行后在控制臺(tái)中打出來的SQL分別是:

          Hibernate: update CUSTOMER user0_ set user0_.USERNAME=?, user0_.PASSWORD=? where (user0_.USERNAME=? and user0_.PASSWORD=?)

          Hibernate: delete from CUSTOMER user0_ where (user0_.USERNAME=? and user0_.PASSWORD=?)

          以上是我認(rèn)為比較好的方法。但是注意,產(chǎn)生的第二條語句不能在MySql中執(zhí)行,但是hql仍然可以被編譯成sql,不知道是我語法寫錯(cuò)了還是bug?有誰了解可以給我maillippea@sohu.com。另外在參考文件BulkManipulationTest.java中有一個(gè)方法:

          public QueryTranslatorImpl assertTranslation(String hql) throws QueryException, MappingException;

          這個(gè)方法我不知道是干嘛的,但是我嘗試了按照這種形式進(jìn)行批量操作:

          String hqlDelete = “ DELETE FROM user u “+
          “ WHERE u.username
          =:username and u.password=:password “;
           Object[] objects 
          = new Object[]{“hfm”,”1”}
           Type[] types
          =new Type[]{(Type)Hibernate.STRING,(Type)Hibernate.STRING};
          QueryParameters queryParas 
          = new QueryParameters(types,objects);
          QueryTranslatorFactory ast 
          = new ASTQueryTranslatorFactory();
          QueryTranslator newQueryTranslator 
          = 
               ast.createQueryTranslator(hqlDelete, Collections.EMPTY_MAP,
               (SessionFactoryImplementor)sf );
          newQueryTranslator.compile( Collections.EMPTY_MAP, 
          false );
          int num = newQueryTranslator.executeUpdate(queryParas,
                         (SessionImplementor)session);

          sf的類型為org.hibernate.SessionFactorysession的類型為org.hibernate.Session。使用這種方法的結(jié)果與上面那種方法的結(jié)果相同,但是在對(duì)hql中變量進(jìn)行賦值很不方便,我也沒發(fā)現(xiàn)這種方法有什么更廣泛的用處。或許有別的方法賦值,或者其它用處?

          posted on 2005-05-27 17:36 lippea'blog 閱讀(1448) 評(píng)論(1)  編輯  收藏 所屬分類: Hibernate

          FeedBack:
          # re: 使用hibernate進(jìn)行批量更新和刪除操作
          2006-03-05 02:06 | zhaoce
          我也使用了SessionImplementor接口去強(qiáng)制轉(zhuǎn)換Session session
          以便我更方便地使用Dialect對(duì)象去包裝我的sql語句
          但是我總擔(dān)心,這樣操作會(huì)不會(huì)哪一天出什么問題
          萬一哪天SessionImpl extends AbstractSession implements SessionImplementor不再有效
          那就完蛋了  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 兴义市| 伊宁县| 海宁市| 枞阳县| 桃江县| 永善县| 桂林市| 威信县| 连州市| 郎溪县| 木兰县| 英吉沙县| 双牌县| 杭州市| 江川县| 湖北省| 阿合奇县| 竹溪县| 龙陵县| 怀来县| 灌阳县| 玉树县| 闽清县| 南丹县| 剑阁县| 且末县| 湟源县| 图片| 久治县| 新绛县| 顺平县| 莆田市| 天台县| 襄汾县| 永吉县| 班戈县| 顺昌县| 绥芬河市| 偃师市| 长春市| 旬阳县|