1

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

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

是否可以按标准删除但首先不加载列表?

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

背景

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

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

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

由于 Criteria 最等同于 WHERE 子句,(不是吗?)我认为没有理由不能将 Criteria 用于删除。

4

2 回答 2

0

您确实只能使用 HQL 来做到这一点。没有等效的标准 API。

于 2011-06-26T07:01:11.330 回答
0

我认为您可以使用HibernateTemplateexecute(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);
        }
    }
});

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

于 2013-02-20T08:35:52.980 回答