各位高手,HibernateTemplate批量修改或批量删除的问题

xiongzeng 2007-12-17 09:22:44
各位大侠,我现在用的是spring+hibernate框架,在底层我怎么用getHibernateTemplate做批量修改或批量删除?性能要好。
谢谢
...全文
2907 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
telephone518 2008-06-15
  • 打赏
  • 举报
回复
你可以在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')
iskyshop 2007-12-19
  • 打赏
  • 举报
回复
executeUpdate也是循环删除,这个和2楼的其实是一样,你可以查看一下源码,这种批量删除只能这么做,不可能有什么其他的方法
xiongzeng 2007-12-19
  • 打赏
  • 举报
回复
谢谢大家。
以上方法都可以实现,但性能不是很好。如要删除1000条数据,那么要session.delete()1000次,这样显然是不妥的。
我的意思是getHibernateTemplate有没有像hibernate这样的批量删除语句:

Query q =getCurrentSession().createQuery(hsql);
q.executeUpdate();

请高手指点,谢谢!
FredWorks 2007-12-17
  • 打赏
  • 举报
回复
删除和修改的方法跟保存是类似的,只要把session.save()缓存session.delete()或者session.update()就可以了
iskyshop 2007-12-17
  • 打赏
  • 举报
回复
public void batchSave(List<Object> list){
for(Object obj:list){
getHibernateTemplate.save(obj);
}
}
FredWorks 2007-12-17
  • 打赏
  • 举报
回复
先在循环里面调用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;
}
});
}

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧