各位大侠,我现在用的是spring+hibernate框架,在底层我怎么用getHibernateTemplate做批量修改或批量删除?性能要好。
  谢谢

解决方案 »

  1.   

    先在循环里面调用session.save()来保存,然后当到达指定的批处理数目的时候(比如20个),执行 session.flush()和session.clear()来将数据写入数据库并清空Hibernate缓存。    public List<SomeObject> saveFiberCodes(final List<SomeObject> codes) {
            return (List<SomeObject>) this.getHibernateTemplate().execute(new HibernateCallback() {
                @Override
                public Object doInHibernate(Session session) throws HibernateException, SQLException {
                    for (int i = 0; i < codes.size(); i++) {
                        session.save(codes.get(i));
                        if (i % 20 == 0) {
                            session.flush();
                            session.clear();
                        }
                    }
                    
                    return codes;
                }
            });
        }
      

  2.   

    public void batchSave(List<Object> list){
     for(Object obj:list){
       getHibernateTemplate.save(obj);
      }
    }
      

  3.   

    删除和修改的方法跟保存是类似的,只要把session.save()缓存session.delete()或者session.update()就可以了
      

  4.   

    谢谢大家。
    以上方法都可以实现,但性能不是很好。如要删除1000条数据,那么要session.delete()1000次,这样显然是不妥的。
    我的意思是getHibernateTemplate有没有像hibernate这样的批量删除语句:Query q =getCurrentSession().createQuery(hsql);
    q.executeUpdate();请高手指点,谢谢!
      

  5.   

    executeUpdate也是循环删除,这个和2楼的其实是一样,你可以查看一下源码,这种批量删除只能这么做,不可能有什么其他的方法
      

  6.   

    你可以在spring中用回调来使用hibernate的Api.public void updateStatus(final int status, final Date date) {
    // TODO Auto-generated method stub
    final String dateStr = TimeParser.format(date, "yyyy-MM-dd");
    List rets = (List)hibernateTemplate.execute(new HibernateCallback(){ @Override
    public Object doInHibernate(Session session)
    throws HibernateException, SQLException {
    // TODO Auto-generated method stub
    List<Integer> result = new ArrayList<Integer>();
    String hqlUpdate = "update WebFlowStat set isOver="+status+" where dealDate=to_date('"+dateStr+"','yyyy-MM-dd')";
    Query query = session.createQuery(hqlUpdate);
    result.add(query.executeUpdate());
    return result;
    }

    });
    }这样就可以批量更新了;控制台上显示只执行了一条更新语句
    Hibernate: update WEB_FLOW_STAT set IS_OVER=2 where DEAL_DATE=to_date('2008-03-01', 'yyyy-MM-dd')