hibernate的批量删除

Posted 习惯沉淀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate的批量删除相关的知识,希望对你有一定的参考价值。

转自:hibernate的批量删除
一般而言,hibernate的批量删除的写法有两种,一种是hibernate内置的批量删除,不过他的批量删除是将每条记录逐一生成删除
语句,其效率极低,当然我们可以使用抓取策略给其进行优化,不过这只是亡羊补牢的方法,效率的提升依然不能让我们满意,很不推荐使用;
另一种是由"拼串"形成的HQL语句,其能够形成一条语句,从而是效率得到最大的提升;

我们先说"拼串"形式的写法:
 个人使用是ssh,故此使用的是spring模板,如果单独使用hibernate,请增加事务与关闭session;
   

  1. //一条删除语句的写法
  2.     public void del(int[] selectFlag) {
  3.     //数组中封装的是ID的集合;
  4.         String hql = "";
  5.         for(int i=0;i<selectFlag.length;i++) {
  6.             if(i==0) {
  7.                 hql = "id="+selectFlag[i];
  8.             } else {
  9.                 hql =hql + " or id="+selectFlag[i];
  10.             }
  11.         }   
  12.         Session session= this.getSession();
  13.         Query q= session.createQuery("delete from User where "+hql);
  14.         q.executeUpdate();
  15.     }

    此写法会形成一条HQL语句,得到最大的提升;


然后我们说下是hibernate内置的批量删除:

     调用dao层,并传递容器;

  1.         /**
  2.          * hibernate的批量删除;
  3.          * 缺点:删除时是多条删除语句,影响效率;
  4.          */
  5.         List list = new ArrayList();
  6.         for(int i=0;i<selectFlag.length;i++){
  7.             User u= new User();
  8.             u.setId(selectFlag[i]);
  9.             list.add(u);    
  10.         }
  11.         dao.del(list);
  12.         //调用DAO层的删除方法;

    DAO层:

  1. public void del(List list) {
  2.         this.getHibernateTemplate().deleteAll(list);
  3.     }

    此种方法会发出多条的删除语句,影响效率极大;

以上是关于hibernate的批量删除的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate批量删除的两种方式

hibernate如何删除数据

基于注解的Spring MVC整合Hibernate(所需jar包,spring和Hibernate整合配置,springMVC配置,重定向,批量删除)

java框架hibernate批量删除数据的时候用啥方法效率比较高?

怎样解决hibernate中一级缓存导致数据不能刷新

HIbernate“StaleStateException:批量更新从更新 [0] 返回了意外的行数;实际行数:0;预期:1”