如何有效地使用Criterion删除实体?

时间:2011-06-26 06:45:53

标签: java performance hibernate optimization spring-orm

目前,我必须创建一个临时Criteria并使用Criteria.list()获取匹配的实体列表,然后将列表传递给HibernateTemplate.deleteAll()

void delete(Criterion criterion) {
    Criteria c = DetachedCriteria.forClass(Foo.class).getExecutableCriteria(session);
    c.add(criterion);
    getHibernateTtemplate().deleteAll(c.list());
}

是否可以通过Criterion删除但在第一次没有加载列表?

也许,我应该将标准转换为HQL,如"delete from Foo where " + criterion.toHQL()

背景

我有一个搜索表单,稍后会被解析并转换为Criteria组合。

使用Criteria.list()检索搜索结果。

现在,一个问题出现了,我想删除所有搜索结果。我是否应该再次解析搜索表单,但是以不同的方式将其转换为HQL字符串?如果我可以重复使用标准,那么事情会更简单。

由于Criteria最相当于WHERE子句,(不是吗?)我认为没有理由不能使用Criteria进行删除。

2 个答案:

答案 0 :(得分:0)

您确实只能使用HQL执行此操作。没有标准API等效。

答案 1 :(得分:0)

我认为您可以使用 HibernateTemplate 类中的方法execute(HibernateCallback action)。它看起来像这样:

final Criterion criteria;
HibernateTemplate template;
template.execute(new HibernateCallback() {
    @Override
    public Object doInHibernate(Session session) throws HibernateException, SQLException {
        List toDelete = session.createCriteria(Student.class).add(criteria).list();
        for (Object o: toDelete){
            session.delete(o);
        }
    }
});

恕我直言,这个解决方案效率不高,因为在删除之前必须阅读所有条目。更重要的是,你必须单独删除每个条目,这是非常低效的。