Как удалить по критериям в спящем режиме?
У меня есть таблица учеников и хочу удалить всех учащихся в классе.
Итак, мой запрос 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;
}
Ответы
Ответ 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";
}