如何在hibernate中按标准删除?

cha*_*han 39 java hibernate

我有一张学生桌,想要删除班上的所有学生.

所以我的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)


Sha*_*ams 8

您可以通过以下简单的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)

详情请参阅


San*_*man 7

我知道我来晚了,但如果你碰巧使用 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)


İsm*_*vuz 5

这是最好的方法,比@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

  • 好吧,它并不能直接回答“如何使用带有条件的Hibernate来做到这一点?”的问题。...但是确实实现了用于通过id删除单个实体的最简单的纯休眠解决方案。 (3认同)