簡體   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