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());
}

Criterionで削除することはできますが、最初にリストをロードせずに削除できますか?

たぶん、私は基準を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);
        }
    }
});

IMHOこのソリューションは、削除する前にすべてのエントリを読み取る必要があるため、あまり効率的ではありません。さらに、各エントリを個別に削除する必要がありますが、これは非常に非効率的です。

于 2013-02-20T08:35:52.980 に答える