<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不再有效
    那就完蛋了  回復  更多評論
      

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


    網站導航:
     
    主站蜘蛛池模板: 1区1区3区4区产品亚洲| 青青草原亚洲视频| 日韩免费一区二区三区在线| 青青视频观看免费99| 亚洲免费精彩视频在线观看| 亚洲精品无码av片| 中国好声音第二季免费播放| 24小时日本韩国高清免费| 四虎永久免费网站免费观看| 亚洲国产另类久久久精品小说| 亚洲伦理中文字幕| 男女一边桶一边摸一边脱视频免费 | 亚洲另类无码专区丝袜| 成年女人A毛片免费视频| 亚洲日本中文字幕一区二区三区| 亚洲精品456在线播放| 成人久久久观看免费毛片| 84pao强力永久免费高清| 亚洲欧洲精品成人久久曰影片| 亚洲人成片在线观看| 国产免费人成视频尤勿视频| 亚洲国产成人高清在线观看 | 午夜亚洲福利在线老司机| 亚洲色图视频在线观看| 久久午夜伦鲁片免费无码| 亚洲国产精品毛片av不卡在线| 亚洲一级在线观看| 99热精品在线免费观看| 亚洲av专区无码观看精品天堂| 在线免费观看中文字幕| 亚洲视频小说图片| 99精品全国免费观看视频| 亚洲高清美女一区二区三区| 午夜宅男在线永久免费观看网| 777亚洲精品乱码久久久久久| 男男AV纯肉无码免费播放无码| 色爽黄1000部免费软件下载| 久久久久久亚洲精品成人| 9277手机在线视频观看免费| 亚洲一区二区无码偷拍| 好爽…又高潮了毛片免费看|