Hibernate中的Delete()和Deleteall()

时间:2012-03-01 10:16:13

标签: sql hibernate list

考虑以下两种方法来删除一组名为“John”的员工。

List<Employee> list = new ArrayList<Employee>();
String query=   " from Employee emp where emp.name = 'John'";
list=getHibernateTemplate().find(query);

第一种方法:

 getHibernateTemplate().deleteAll(list);

第二种方法:

Iterator<BulkChangeRequest> itList = list.iterator();
    while(itList.hasNext()) {
        Employee emp = itList.next();
        getHibernateTemplate().delete(emp);
    }

它们在性能方面有显着差异吗?它们是否基本相同,即deleteAll方法是否逐个删除行?

使用以下查询在SQL中执行此操作也不是更好吗?

" delete from Employee where name = 'John'"

2 个答案:

答案 0 :(得分:1)

是。最好使用SQL或HQL删除名为“John”的所有员工记录,而不是第一个选项。只是因为在第一个选项中,您必须将所有员工记录从db加载到删除。这显然是一项额外的任务。

我认为,对于delete()deleteAll(),除delete()之外没有区别,它会为每次通话创建新会话;而在deleteAll()中,所有对象都将在一个会话中删除。但查询的数量将是相同的。

答案 1 :(得分:1)

我建议你阅读本节one shot delete

https://docs.jboss.org/hibernate/orm/3.5/reference/en/html/performance.html#performance-collections-oneshotdelete

  

逐个删除集合元素有时可能非常有用   效率低下。 Hibernate知道不会这样做   新空集合(例如,如果你调用了list.clear())。在   在这种情况下,Hibernate将发出一个DELETE。