使用hibernate進行批次更新和刪除操作

來源:互聯網
上載者:User
本文中的功能僅存在於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?有誰瞭解可以給我mail:lippea@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.SessionFactory,session的類型為org.hibernate.Session。使用這種方法的結果與上面那種方法的結果相同,但是在對hql中變數進行賦值很不方便,我也沒發現這種方法有什麼更廣泛的用處。或許有別的方法賦值,或者其它用處?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.