Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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 org.hibernate.hql.internal.QueryExecutionRequestException:不使用hibernate的DML操作不支持_Java_Hibernate_Hql - Fatal编程技术网

Java org.hibernate.hql.internal.QueryExecutionRequestException:不使用hibernate的DML操作不支持

Java org.hibernate.hql.internal.QueryExecutionRequestException:不使用hibernate的DML操作不支持,java,hibernate,hql,Java,Hibernate,Hql,我有一个基于2.1.0.RELEASE的spring引导应用程序,使用hibernate 5.3.7.Final进行大多数交互 到数据库,除了我想删除一个对象列表的两种情况,因此我想执行一个方法,将该列表作为批量删除。我已经可以使用普通的hql查询以列表的形式执行getBulk,因此 我想对删除操作使用相同的方法,因为它要快得多 实体的创建方式如下: 我有一个表属性,它与一个名为Value的表有一对一的映射。 值表只有一个关系,即与属性的关系 @Repository @Entity @Table

我有一个基于2.1.0.RELEASE的spring引导应用程序,使用hibernate 5.3.7.Final进行大多数交互 到数据库,除了我想删除一个对象列表的两种情况,因此我想执行一个方法,将该列表作为批量删除。我已经可以使用普通的hql查询以列表的形式执行getBulk,因此 我想对删除操作使用相同的方法,因为它要快得多

实体的创建方式如下:

我有一个表属性,它与一个名为Value的表有一对一的映射。 值表只有一个关系,即与属性的关系

@Repository
@Entity
@Table(name="ATTRIBUTE")
@OnDelete(action=OnDeleteAction.CASCADE)
public class Attribute implements AttributeInterface {

    .......

    @OneToOne(cascade=CascadeType.ALL, orphanRemoval=true)
    @ElementCollection(fetch=FetchType.EAGER)
    @JoinColumn(name="VALUE_ID", nullable=false)
    @OnDelete(action=OnDeleteAction.CASCADE)
    private Value valueId;
}
博士后:

\d attribute;
                              Table "public.attribute"
         Column          |           Type           | Collation | Nullable | Default 
-------------------------+--------------------------+-----------+----------+---------                           
 id                      | bytea                    |           | not null | 
 .......
 value_id                | bigint                   |           | not null | 
 .......

Indexes:
    "attribute_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
    .......
    "fksc44hph1sm89gdg2o01bjiuad" FOREIGN KEY (value_id) REFERENCES value(id) ON DELETE CASCADE
存储库方法使用@Transactional和@Modifying注释进行显式注释。我的服务类中也有@Transactional注释调用delete

@Transactional
@Modifying
@Override
public void delete(Collection<byte[]> list) {


    try {


        Session session = getSessionFactory().openSession();
        session.beginTransaction();

        session.flush();
        session.clear();


        String hql_query = "DELETE from Attribute as o WHERE o.id IN (:ids)";
        Query<?> query = session.createQuery(hql_query);

        query.setParameterList("ids", list);
        query.list();



        session.getTransaction().commit();
        session.close();


    } catch (Exception e) {
        logger.error("Exception", e);
        throw e;
    }
}
这里和这里都描述了这一特殊情况

我在互联网上读到了我需要的东西

org.springframework.data.jpa.repository.Modifying

注释。 我不得不添加额外的依赖项,即spring数据jpa工件,因为我没有修改注释。i、 e

<dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
</dependency>

我的问题是我在delete bulk方法中做错了什么。这里有什么我遗漏的吗?

这与修改
无关<代码>修改
是一个Spring数据注释,但您似乎没有使用Spring数据

您正在执行用于执行返回结果的select语句的

由于您正在尝试执行删除,因此需要使用

JavaDoc声明:

执行update或delete语句

<dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
</dependency>
    session.delete(attribute);
    session.getTransaction().commit();
    session.close();