[英]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.