如何在休眠状态下按标准删除?

2022-09-01 02:19:58

我有一个学生表,想要删除班级中的所有学生。

所以我的sql查询看起来像这样:

delete from student where classId = 333

如何使用带有条件的休眠来执行此操作?

我需要这个,这样我就可以放入我的一个基类,供从它扩展的任何DAO对象使用。因此,我可以在我所有的 DAO 对象中使其通用。

目前,我已经创建了一个将在学生对象中获取的泛型方法 - 调用使用条件获取列表的 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();

有关详细信息,请参阅


推荐