关于Hibernate3,根据ID进行批量修改应该如何操作

coolhwm 发布于 2012/07/06 10:39
阅读 2K+
收藏 0

假设我有一个邮件的持久化对象:

class Mail{
    private int id;
    private int status;
}

从前台会传来一个id的数组:

List<Integer> ids;

我需要把数据库中所有id匹配,并且邮件状态为1,改成状态2。

在Hibernate中如何处理比较好?单次操作量平均在1~100之间。

 

目前有几种思路:

1)一种是使用HQL语句进行批量修改

update Mail m set m.status = 2 where m.status = 1 and m.id in (id1, di2 .... idn)

这种方法中使用了in子句,一般情况下应该只会生成一条SQL语句,和服务器交互一次,但不知效率如何?

这种方法下完全没有利用到Hibernate的缓存优势。

2)使用for语句,将对象load出来,再调用set方法修改值

for(int id : ids){
    Mail m = load(id);
    m.setStatus(2);
}

这种情况下,若二级缓存里都已有数据,应该是有N条update语句,但只需要一次Batch的提交。

但是若其中有m条数据不在服务器中,那么似乎将会有m次的查询,外加一次的Batch提交update。

 

找过很多资料,水平有限,还是不知道如何操作比较妥当,求指点。

以下是问题补充:

@coolhwm:因为数据量可能不是很大,我想应该没必要使用SQL吧?在此基础上怎么才是比较高效的方法呢、 (2012/07/06 12:32)
加载中
0
sxgkwei
sxgkwei
这种情况,不要用它本身提供的方式来更新啦,因为hibernate是orm模型,所以必须每隔对象都在内存中,然后一个一个去改,效率太差。直接用hibernate提供的运行hql的接口去运行自己写的HQL就好了。
sxgkwei
sxgkwei
回复 @coolhwm :语句本身和SQL一样的效率,不过大家都知道的,hibernate执行一个语句总要执行一些其它的无用语句,hibernate本来就这样儿,你也没辙。
c
coolhwm
谢谢,不知是否了解,用HQL的话,使用in(id1, id2, ....., idn)效率如何呢?
0
JackyYong
JackyYong
直接用JDBC多好
zplswf
zplswf
不会到你用的什么框架搭建架构的
0
如风随影
如风随影
大数据用原型sql 做批量更新好些
0
jeffsui
jeffsui
直接调用个存储过程多好。
0
i
ivan118
其实你只是改个状态值,直接在存储过程中执行是很快的,哪怕几万条也是在一顺间就执行完了。
返回顶部
顶部