当前位置: 首页 > 知识库问答 >
问题:

org.hibernate.hql.internal.查询执行请求异常:不支持不使用Hibernate的DML操作

傅树
2023-03-14

我有一个基于2.1.0的Spring启动应用程序。RELEASE并使用hibernate 5.3.7。对数据库的大多数交互都是最终的,除了一些我想删除对象列表的情况,因此我想执行一个批量删除该列表的方法。我已经可以使用普通的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;
}

来自postgres:

\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;
    }
}

这给了我一个错误

java.lang.IllegalStateException: org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [DELETE from org.Attribute as o WHERE o.id=:ids]
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1508)

这里和这里都描述了这一特殊情况https://www.javabullets.com/spring-data-jpa-query-not-supported-for-dml-operations/

我在互联网上阅读了《我需要》

org.springframework.data.jpa.repository.修改

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

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

我现在有了它,但仍然不允许删除查询。

如果我稍微更改一下代码并使用hibernate删除行,那么它都可以工作,但在这种情况下这不是恶意删除,而且速度很慢。即如果我将整个属性作为对象传递并为集合结束调用hibernate会话上的每个循环直接执行,那么它就可以工作。

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

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

共有1个答案

华衡
2023-03-14

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

您正在执行查询。list()用于执行返回结果的select语句。

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

JavaDoc声明:

执行update或delete语句。

 类似资料:
  • 问题内容: 我写了一个查询来删除我的扩展接口中的某些对象,但是当我执行查询时,它会抛出异常!谁能为我解释一下? 查询: 我收到了此错误,请问,请为我解释一下,谢谢大家:) 例外: 问题答案: 尝试这个: 每当您尝试修改db中的记录时,都必须将其标记为@Transactional和@Modifying,这将指示Spring可以修改现有记录。 存储库方法必须为空,否则将不断抛出异常。

  • 我已经编写了一个查询来删除扩展接口中的一些对象,但是当我执行查询时,它会抛出一个异常!谁能给我解释一下吗? 查询: 我犯了这个错误,请任何人帮我解释一下,谢谢大家:) 例外情况:

  • 当我使用以下HQL时,我得到了DML操作不支持的错误

  • 这以前被问过一次,但解决方案并没有解决问题。我正在创建一个JUnit测试: 上述测试调用的查询是: 错误:

  • 我在springdatajpa中执行更新查询时遇到问题。这是存储库层中的代码: 如您所见,我已经添加了@修改注释,但它仍然抛出“不支持DML操作”的错误,我正在使用Hibernate 5.4。非常感谢任何帮助。

  • 作为测试的一部分,我一直在尝试创建一个用户,然后将其删除,但我不断收到相同的错误组织。冬眠hql。内部的QueryExecutionRequestException:即使在我的存储库和控制器中不断更改代码之后,DML操作也不受支持。 这是我的存储库中的代码: 这是我的控制器中的代码: