假设我有一个邮件的持久化对象:
class Mail{
private int id;
private int status;
}
从前台会传来一个id的数组:
List 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。
这种情况,不要用它本身提供的方式来更新啦,因为hibernate是orm模型,所以必须每隔对象都在内存中,然后一个一个去改,效率太差。直接用hibernate提供的运行hql的接口去运行自己写的HQL就好了。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。