我有一张学生桌,想要删除班上的所有学生.
所以我的SQL查询看起来像:
delete from student where classId = 333
Run Code Online (Sandbox Code Playgroud)
如何使用带有标准的休眠来执行此操作?
我需要这个,所以我可以放入我的一个基类,以便从它扩展的任何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;
}
Run Code Online (Sandbox Code Playgroud)
Õzb*_*bek 70
对于删除使用HQL这是最好的选择,我认为,Criteria的主要目的是仅检索数据.
这个是Criteria
Student student = (Student ) session.createCriteria(Student.class)
.add(Restrictions.eq("classId", classId)).uniqueResult();
session.delete(student);
Run Code Online (Sandbox Code Playgroud)
这个是简单的HQL查询:
String hql = "delete from Student where classId= :classId";
session.createQuery(hql).setString("classId", classId).executeUpdate();
Run Code Online (Sandbox Code Playgroud)
您可以通过以下简单的hibernate轻松实现,
Session session=getSession();
String hql = "delete from Student where classId= :id";
session.createQuery(hql).setLong("id", new Integer(id)).executeUpdate();
Run Code Online (Sandbox Code Playgroud)
详情请参阅
我知道我来晚了,但如果你碰巧使用 JPA 2.1,你可以这样做 -
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();
}
Run Code Online (Sandbox Code Playgroud)
这是最好的方法,比@Jama Asatillayev的答案更好。因为您不必先检索持久对象。
Product product = new Product();
product.setId(37);
session.delete(product);
Run Code Online (Sandbox Code Playgroud)
休眠将运行:
Hibernate: delete from PRODUCT where PRODUCT_ID=?
Run Code Online (Sandbox Code Playgroud)
更多详细信息:http : //www.codejava.net/frameworks/hibernate/hibernate-basics-3-ways-to-delete-an-entity-from-the-datastore