Как удалить по критериям в спящем режиме? - PullRequest
36 голосов
/ 22 января 2012

У меня есть таблица учеников, и я хочу удалить всех учеников в классе.

Так что мой sql-запрос будет выглядеть так:

delete from student where classId = 333

Как я могу сделать это, используя hibernate с критериями?

Мне это нужно, чтобы я мог добавить один из моих базовых классов для использования любыми объектами DAO, которые выходят из него. Так что я могу сделать это универсальным для всех моих объектов DAO.

В настоящее время я создал универсальный метод, который будет взят в объекте Student - вызывает метод find, который использует критерии для получения списка, а затем я выполняю пакетное удаление в рамках одной транзакции следующим образом:

public boolean deleteByCriteria(Object deleteObject) {
    List deleteObjectList = find(deleteObject);
    if (deleteObjectList == null)
        return false;
    return deleteAll(deleteObjectList);
}

public boolean deleteAll(List deleteObjectList) {
    if (logger.isDebugEnabled()) {
        logger.debug("Entered BaseSchoolRollBookDAO -> delete");
        logger.debug("Object for batch deletion [" + deleteObjectList + "]");
    }
    boolean result = false;
    Transaction tx = null;
    // Get CurrentSession from HibernateUtils
    Session session = HibernateUtils.getSession();
    // Start transaction
    tx = session.beginTransaction();

    // Create new Criteria to be passed
    try {
        int flushCount = 0;
        for (Object deleteObject : deleteObjectList) {
            session.delete(deleteObject);
            flushCount++;

            if (flushCount % 20 == 0) {
                session.flush();
                session.clear();
            }
        }           

        tx.commit();
        result = true;
    } catch (HibernateException e) {
        logger.fatal("Exception in executing batch Delete query", e);
        if (tx != null && tx.isActive())
            tx.rollback(); 
    }
    return result;
}

Ответы [ 8 ]

69 голосов
/ 22 января 2012

Для удаления используйте HQL, который является лучшим вариантом , я думаю, Основным критерием критериев является только получение данных.
Это с Criteria

  Student student = (Student ) session.createCriteria(Student.class)
                    .add(Restrictions.eq("classId", classId)).uniqueResult();
  session.delete(student);

А это простой HQL-запрос:

String hql = "delete from Student where classId= :classId";
session.createQuery(hql).setString("classId", classId).executeUpdate();
8 голосов
/ 15 ноября 2012

Вы можете легко достичь, выполнив простой спящий режим следующим образом:

Session session=getSession();  
String hql = "delete from Student where classId= :id"; 
session.createQuery(hql).setLong("id", new Integer(id)).executeUpdate();

для подробностей см.

4 голосов
/ 25 августа 2015

Это лучший и лучший ответ, чем ответ @Jama Asatillayev. Потому что вам не нужно сначала извлекать постоянный объект.

Product product = new Product();
product.setId(37);
session.delete(product);

И Hibernate будет работать:

Hibernate: delete from PRODUCT where PRODUCT_ID=?

Подробнее: http://www.codejava.net/frameworks/hibernate/hibernate-basics-3-ways-to-delete-an-entity-from-the-datastore

3 голосов
/ 28 сентября 2016

Вам следует обновить свою версию hibernate до версии, которая реализует JPA 2.1 (Hibernate запускает JPA 2.1 в версии 4.3.11.Final - Загрузки Hibernate )

После обновления выможно использовать CriteriaDelete , чтобы делать то, что вы хотите.Вот небольшой пример: Пример

1 голос
/ 24 мая 2018

Вы можете использовать критерии для условия

public Integer deleteByFieldIn(String Field, Iterable<?> values) {
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaDelete<T> delete = cb.createCriteriaDelete(getDomainClass());
    Root<T> e = delete.from(getDomainClass());
    delete.where(cb.in(e.get(Field)).value(values));
    return entityManager.createQuery(delete).executeUpdate();
}

, и Вы можете использовать их для равных условий, заменяя их на равные

public Integer deleteById(String id) {
    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaDelete<T> delete = cb.createCriteriaDelete(getDomainClass());
    Root<T> e = delete.from(getDomainClass());
    delete.where(cb.equal(e.get("id"), id));
    return entityManager.createQuery(delete).executeUpdate();
}
0 голосов
/ 06 февраля 2019

Я знаю, что довольно поздно для вечеринки, но если вам случится использовать JPA 2.1, вы можете сделать это следующим образом -

https://thoughts -on-java.org / критерии-updatedelete-легкий путь к /

 public void deleteOrder(Double amount) {
    CriteriaBuilder cb = this.em.getCriteriaBuilder();

    // create delete
    CriteriaDelete<Order> delete = cb.
     createCriteriaDelete(Order.class);

    // set the root class
    Root e = delete.from(Order.class);

    // set where clause
    delete.where(cb.lessThanOrEqualTo(e.get("amount"), amount));

    // perform update
    this.em.createQuery(delete).executeUpdate();
}
0 голосов
/ 19 августа 2015

сначала вам нужна форма с вводом, значением ввода является модель, которую вы смоделировали в mapmap, а затем удалите в какой-либо ссылке.чем получить параметр id, с помощью @requestparam ("id") String id

узнать, что мы получили идентификатор объекта, а затем удалить идентификатор, например

@RequestMapping(value="delsubloc",method=RequestMethod.GET)
    public String DeleteLoc(@RequestParam("id")Long id) {
        PplLocDtlDAO dtl = new PplLocDtlDAO();
        PplLocDtl loc = new PplLocDtl();
        loc.setLocDtlId((long)id);
        dtl.delete(loc);
        return "redirect:/lokasi";
    }
0 голосов
/ 18 декабря 2014
 /**
 * 
 * @param objects
 */
 public static void deleteAll(List<?> objects) {

            try {
                HibernateEntityManager em = JPA.em().unwrap(HibernateEntityManager.class);
                Session session = em.getSession();
                for (Object o : objects) {
                    session.delete(o);
                }
            } catch (Exception e) {
                Logger.error("CommonHibernateBD_deleteAll error: " + e);
                e.printStackTrace();
            }

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