Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在hibernate中按条件删除?_Java_Hibernate - Fatal编程技术网

Java 如何在hibernate中按条件删除?

Java 如何在hibernate中按条件删除?,java,hibernate,Java,Hibernate,我有一个学生表,希望删除一个类中的所有学生 因此,我的sql查询如下所示: delete from student where classId = 333 如何使用带条件的hibernate实现这一点 我需要它,这样我就可以把我的一个基类放进去,供任何从它扩展的DAO对象使用。因此,我可以在我的所有DAO对象中使其通用 目前,我已经创建了一个通用方法,该方法将在Student对象中使用-调用使用条件获取列表的find方法,然后我在一个事务下执行批量删除,如下所示: public boolean

我有一个学生表,希望删除一个类中的所有学生

因此,我的sql查询如下所示:

delete from student where classId = 333
如何使用带条件的hibernate实现这一点

我需要它,这样我就可以把我的一个基类放进去,供任何从它扩展的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;
}

对于删除使用HQL,HQL是最好的选择,我认为,标准的主要目的是只检索数据。
这一个符合
标准

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

您可以通过如下简单的hibernate轻松实现:

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

/**
* 
*@param对象
*/
公共静态void deleteAll(列出对象){
试一试{
HibernateEntityManager em=JPA.em().unwrap(HibernateEntityManager.class);
Session Session=em.getSession();
用于(对象o:对象){
删除(o);
}
}捕获(例外e){
Logger.error(“CommonHibernateBD_deleteAll error:+e”);
e、 printStackTrace();
}
}

首先,您需要一个带有输入的表单,输入的值是您在modelmap中建模的模型,而不是 制作 删除 在某些链接中。 然后使用 @requestparam(“id”)字符串id

我知道我们有这个物体的id 然后删除id e、 g


这是最好的方法,比@Jama asatilayev的答案更好。 因为您不必首先检索持久对象

Product product = new Product();
product.setId(37);
session.delete(product);
然后hibernate将运行:

Hibernate: delete from PRODUCT where PRODUCT_ID=?

更多详细信息:

您应该将hibernate版本升级到实现JPA2.1的版本(hibernate在版本4.3.11.Final上启动JPA2.1)

升级后,可以使用CriteriaDelete执行所需操作。 下面是一个小例子:

您可以使用条件中的条件

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 deleteByFieldIn(字符串字段,Iterable值){
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaDelete=cb.createCriteriaDelete(getDomainClass());
Root e=delete.from(getDomainClass());
删除.其中(cb.in(e.get(Field)).value(values));
返回entityManager.createQuery(delete.executeUpdate();
}
您可以通过将“in”替换为“equal like”来对“equal”条件使用相同的值

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();
}
public整数deleteById(字符串id){
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaDelete=cb.createCriteriaDelete(getDomainClass());
Root e=delete.from(getDomainClass());
删除。其中(cb.equal(e.get(“id”),id));
返回entityManager.createQuery(delete.executeUpdate();
}

我知道我参加聚会已经很晚了,但是如果你碰巧使用JPA2.1,你可以这样做-

公共订单(双倍金额){
CriteriaBuilder cb=this.em.getCriteriaBuilder();
//创建删除
CriteriaDelete=cb。
createCriteriaDelete(Order.class);
//设置根类
根e=delete.from(Order.class);
//设置where子句
删除。其中(cb.lessThanOrEqualTo(e.get(“金额”),amount));
//执行更新
this.em.createQuery(delete.executeUpdate();
}

要删除,必须使用
标准删除
查询<代码>CriteriaBuilder确保如果正确使用此选项,查询是类型安全的。向方法中添加元数据类
Student
,以避免
HQL
JPQL
NativeQuery
特有的错误

...

private EntityManager em;

...

public void deleteByIdUser(int classId) {
    try {
        CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaDelete<Student> deleteQuery = builder.createCriteriaDelete(Student.class);

        Root<Student> studentTable = deleteQuery.from(Student.class);       

        Path<Long> classIdPath = userRoleTable.get(Student_.classId);
        Predicate classIdPredicate = builder.equal(classIdPath, classId);

        deleteQuery.where(classIdPredicate);
        em.createQuery(deleteQuery).executeUpdate();    
    } catch (Exception e) {
        ...
    }
}

。。。
私人实体管理者;
...
公共void deleteByIdUser(int classId){
试一试{
CriteriaBuilder=em.getCriteriaBuilder();
CriteriaDeleteQuery=builder.createCriteriaDelete(Student.class);
Root studentTable=deleteQuery.from(Student.class);
Path classIdPath=userRoleTable.get(Student\ux.classId);
谓词classIdPredicate=builder.equal(classIdPath,classId);
deleteQuery.where(classIdPredicate);
em.createQuery(deleteQuery).executeUpdate();
}捕获(例外e){
...
}
}
必须将此信息添加到pom中,才能为实体生成元数据类

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <annotationProcessorPaths>
            <path>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-jpamodelgen</artifactId>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>

org.apache.maven.plugins
maven编译器插件
org.hibernate
冬眠

这是冗长的,但避免了冗余的
运行时异常

只是给其他人的一个提示。如果使用Jamshid建议的Hibernate版本,则仍然必须存储事务:tx=session.beginTransaction();然后执行提交:tx.commit();为了让它工作,这个标准真的有效吗?看起来很奇怪,让学生成为uniqueResult然后删除它。我已经离开了Hibernate,很抱歉在很长一段时间后发表了这个评论,但我认为上面的Hibernate标准示例不起作用,因为这是我问这个问题的主要原因,也是为什么我必须在示例中这样做的原因。这不是一个特别好的方法在解决方案中,您需要转到数据库检索结果,然后发送后续的删除指令。如果必须删除1M行怎么办?你真的不想把它们都放到内存中,只想把查询重新发送回数据库。@Michael,你说得对。。。我提到的标准是用于检索的,我只是回答了如何实现这一点,即使使用标准,同时说HQL是最好的选择……我想知道,在循环中删除是否会导致性能问题?好吧,它没有直接回答“我如何使用
 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();
}
...

private EntityManager em;

...

public void deleteByIdUser(int classId) {
    try {
        CriteriaBuilder builder = em.getCriteriaBuilder();
        CriteriaDelete<Student> deleteQuery = builder.createCriteriaDelete(Student.class);

        Root<Student> studentTable = deleteQuery.from(Student.class);       

        Path<Long> classIdPath = userRoleTable.get(Student_.classId);
        Predicate classIdPredicate = builder.equal(classIdPath, classId);

        deleteQuery.where(classIdPredicate);
        em.createQuery(deleteQuery).executeUpdate();    
    } catch (Exception e) {
        ...
    }
}

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <annotationProcessorPaths>
            <path>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-jpamodelgen</artifactId>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>