Как эффективно удалять объекты, используя Критерий? - PullRequest
1 голос
/ 26 июня 2011

В настоящее время я должен создать временный Criteria и получить соответствующий список сущностей, используя Criteria.list(), а затем передать список на HibernateTemplate.deleteAll():

void delete(Criterion criterion) {
    Criteria c = DetachedCriteria.forClass(Foo.class).getExecutableCriteria(session);
    c.add(criterion);
    getHibernateTtemplate().deleteAll(c.list());
}

Можно ли удалить по критерию, но без загрузки списка в первую очередь?

Может быть, мне следует преобразовать критерий в HQL, например "delete from Foo where " + criterion.toHQL()?

ФОН

У меня есть поисковая форма, которая позже будет проанализирована и преобразована в состав Критерии.

Результаты поиска извлекаются с помощью Criteria.list ().

Теперь появился вопрос, я хочу удалить все результаты поиска. Должен ли я снова проанализировать форму поиска, но другим способом, чтобы преобразовать ее в строку HQL? Если бы я мог повторно использовать Критерии, все было бы проще.

Поскольку критерии наиболее эквивалентны предложению WHERE (не так ли?), Я не вижу причин, по которым критерии нельзя было использовать для удаления.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2013

Я думаю, что вы можете использовать метод execute(HibernateCallback action) из класса HibernateTemplate . Это может выглядеть так:

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

ИМХО это решение не очень эффективно, потому что вы должны прочитать все записи, прежде чем удалить их. Более того, вы должны удалять каждую запись по отдельности, что очень неэффективно.

0 голосов
/ 26 июня 2011

Вы действительно можете сделать это только с помощью HQL.Не существует критериев, эквивалентных API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...