轉自:hibernate的批量刪除
一般而言,hibernate的批量刪除的寫法有兩種,一種是hibernate內置的批量刪除,不過他的批量刪除是將每條記錄逐一生成刪除
語句,其效率極低,當然我們可以使用抓取策略給其進行優化,不過這只是亡羊補牢的方法,效率的提升依然不能讓我們滿意,很不推薦使用;
另一種是由"拼串"形成的HQL語句,其能夠形成一條語句,從而是效率得到最大的提升;
我們先說"拼串"形式的寫法:
個人使用是ssh,故此使用的是spring模板,如果單獨使用hibernate,請增加事務與關閉session;
- //一條刪除語句的寫法
- public void del(int[] selectFlag) {
- //數組中封裝的是ID的集合;
- String hql = "";
- for(int i=0;i<selectFlag.length;i++) {
- if(i==0) {
- hql = "id="+selectFlag[i];
- } else {
- hql =hql + " or id="+selectFlag[i];
- }
- }
- Session session= this.getSession();
- Query q= session.createQuery("delete from User where "+hql);
- q.executeUpdate();
- }
此寫法會形成一條HQL語句,得到最大的提升;
然后我們說下是hibernate內置的批量刪除:
調用dao層,並傳遞容器;
- /**
- * hibernate的批量刪除;
- * 缺點:刪除時是多條刪除語句,影響效率;
- */
- List list = new ArrayList();
- for(int i=0;i<selectFlag.length;i++){
- User u= new User();
- u.setId(selectFlag[i]);
- list.add(u);
- }
- dao.del(list);
- //調用DAO層的刪除方法;
DAO層:
- public void del(List list) {
- this.getHibernateTemplate().deleteAll(list);
- }
此種方法會發出多條的刪除語句,影響效率極大;