本文中的功能僅存在于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中提供批量更新操作功能。例如:
















變量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?有誰了解可以給我mail:lippea@sohu.com。另外在參考文件BulkManipulationTest.java中有一個(gè)方法:
public QueryTranslatorImpl assertTranslation(String hql) throws QueryException, MappingException;
這個(gè)方法我不知道是干嘛的,但是我嘗試了按照這種形式進(jìn)行批量操作:


Object[] objects = new Object[]{“hfm”,”1”}
Type[] types=new Type[]{(Type)Hibernate.STRING,(Type)Hibernate.STRING};



ast.createQueryTranslator(hqlDelete, Collections.EMPTY_MAP,
(SessionFactoryImplementor)sf );


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