繁体   English   中英

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

[英]How to delete entities using Criterion efficiently?

当前,我必须创建一个临时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字符串? 如果我可以重用该标准,那么事情将会变得更简单。

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

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

恕我直言,此解决方案不是很有效,因为在删除它们之前必须先阅读所有条目。 而且,您必须单独删除每个条目,这非常无效。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM