Подтвердить что ты не робот

Как удалить по критериям в спящем режиме?

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

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

delete from student where classId = 333

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

Мне нужно это, чтобы я мог использовать один из моих базовых классов для использования любыми объектами 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;
}
4b9b3361

Ответ 1

Для удаления используйте HQL, который лучший вариант, я думаю, главная цель Criteria предназначена только для получения. > данные.
Это с 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();

Ответ 2

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

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

для деталей обратитесь

Ответ 3

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

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

И спящий режим будет запущен:

Hibernate: delete from PRODUCT where PRODUCT_ID=?

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

     }

Ответ 7

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

https://thoughts-on-java.org/criteria-updatedelete-easy-way-to/

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

Ответ 8

сначала вам нужна форма с вводом, значение ввода - это модель, которую вы моделировали в modelmap, чем делать Удалить в некоторой ссылке. чем получить параметр id, с @requestparam ( "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";
    }