目前,我必须创建一个临时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进行删除。
答案 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);
}
}
});
恕我直言,这个解决方案效率不高,因为在删除之前必须阅读所有条目。更重要的是,你必须单独删除每个条目,这是非常低效的。