各位高手,HibernateTemplate批量修改或批量删除的问题 各位大侠,我现在用的是spring+hibernate框架,在底层我怎么用getHibernateTemplate做批量修改或批量删除?性能要好。 谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 先在循环里面调用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; } }); } public void batchSave(List<Object> list){ for(Object obj:list){ getHibernateTemplate.save(obj); }} 删除和修改的方法跟保存是类似的,只要把session.save()缓存session.delete()或者session.update()就可以了 谢谢大家。以上方法都可以实现,但性能不是很好。如要删除1000条数据,那么要session.delete()1000次,这样显然是不妥的。我的意思是getHibernateTemplate有没有像hibernate这样的批量删除语句:Query q =getCurrentSession().createQuery(hsql); q.executeUpdate();请高手指点,谢谢! executeUpdate也是循环删除,这个和2楼的其实是一样,你可以查看一下源码,这种批量删除只能这么做,不可能有什么其他的方法 你可以在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') 新手求一个简单程序(判断空间里的一个点是否在球内) hibernate 使用inner join出现问题 io流问题 无法用printf,请大家调试下这个小程序。 求:鼠标移动显示文字程序 求助:由于无法安装J2SDK引起的系列问题 问一个关于PrintWriter问题 如何在Java中调用MS SQL 2000中的数据备份功能进行数据备份?....... 这个错误是什么意思 关于嵌套method的存取权限的问题,在线等待! 想要JSP和struts的教程视频 如何运行java程序
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;
}
});
}
for(Object obj:list){
getHibernateTemplate.save(obj);
}
}
以上方法都可以实现,但性能不是很好。如要删除1000条数据,那么要session.delete()1000次,这样显然是不妥的。
我的意思是getHibernateTemplate有没有像hibernate这样的批量删除语句:Query q =getCurrentSession().createQuery(hsql);
q.executeUpdate();请高手指点,谢谢!
// 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')