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

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

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

    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中對于批量操作的處理方法是,查詢得到所有符合條件的數據庫數據的主鍵,然后對根據主鍵對每條數據進行操作。這樣感覺既費時又費力。最新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表示有幾條數據被操作了。以上兩段代碼執行后在控制臺中打出來的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=?)

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

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

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

    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。使用這種方法的結果與上面那種方法的結果相同,但是在對hql中變量進行賦值很不方便,我也沒發現這種方法有什么更廣泛的用處。或許有別的方法賦值,或者其它用處?

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

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

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 国产∨亚洲V天堂无码久久久| 免费看一级做a爰片久久| 国产亚洲福利精品一区| 人成午夜免费大片在线观看| 亚洲国产高清在线一区二区三区| 老司机精品视频免费| 一本色道久久88综合亚洲精品高清| 国产亚洲漂亮白嫩美女在线| 国产中文字幕免费观看| 九九久久国产精品免费热6| 亚洲成a人无码av波多野按摩| 一级一看免费完整版毛片| 国产AⅤ无码专区亚洲AV| 日本免费一区二区久久人人澡| 久久久久亚洲Av片无码v| 性xxxx视频免费播放直播| 久久精品国产亚洲AV电影| 动漫黄网站免费永久在线观看| 亚洲JLZZJLZZ少妇| 亚洲精品乱码久久久久久蜜桃| 成人A毛片免费观看网站| 亚洲天堂中文资源| 大地资源在线观看免费高清| 日韩国产精品亚洲а∨天堂免| 91麻豆精品国产自产在线观看亚洲 | 香蕉成人免费看片视频app下载| 久久久久亚洲av无码专区喷水| 很黄很色很刺激的视频免费| 日韩亚洲综合精品国产| 亚洲日韩精品一区二区三区 | 亚洲一区二区三区写真| 亚洲国产综合精品一区在线播放| 国产偷伦视频免费观看| 亚洲一区二区三区高清不卡| 免费在线观看a级毛片| 免费a级毛片无码a∨免费软件| 亚洲免费视频播放| 亚洲精品一级无码中文字幕| 免费无码又爽又刺激高潮视频| 亚洲女女女同性video| 亚洲熟妇丰满多毛XXXX|