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

不支持带有JPA更新查询的DML操作

欧阳乐生
2023-03-14

这以前被问过一次,但解决方案并没有解决问题。我正在创建一个JUnit测试

 @Test
    @Transactional
    @Modifying
    public void updateMaterialInventory() throws Exception{

        // Initialize the database
        materialRepository.saveAndFlush(material);

        long id =  material.getId();
        materialRepository.updateMaterialInventory(id,UPDATED_INVENTORY_COUNT);

        assertEquals(material.getInventory_count(), UPDATED_INVENTORY_COUNT, 0);
    }

上述测试调用的查询是:

 @Query("UPDATE Material m SET m.inventory_count = ?2 WHERE m.id = ?1")
    void updateMaterialInventory(Long id,int newInventoryAmount);

错误:

Caused by: org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [UPDATE com.htd.domain.Material m SET m.inventory_count = ?2 WHERE m.id = ?1]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.errorIfDML(QueryTranslatorImpl.java:318)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:369)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:231)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1264)
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)
    at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573)
    at org.hibernate.jpa.internal.QueryImpl.getSingleResult(QueryImpl.java:495)
    ... 55 more

共有3个答案

赫连俊雄
2023-03-14
@Transactional
@Modifying
@Query(DELETE_INVOICE_BY_NUMBER)
public void deleteInvoiceByNumber(@Param("number") int number);

这对我来说很有效,但如果repository类中没有@Transactional,则会出现错误。

李兴安
2023-03-14

据我了解,您不应该在存储库类中使用@Transactional注释。找到下面的答案。

服务Impl类

import org.springframework.transaction.annotation.Transactional;
...
@Test
@Transactional
public void updateMaterialInventory() throws Exception{

    // Initialize the database
    materialRepository.saveAndFlush(material);

    long id =  material.getId();
    materialRepository.updateMaterialInventory(id,UPDATED_INVENTORY_COUNT);

    assertEquals(material.getInventory_count(), UPDATED_INVENTORY_COUNT, 0);
}

存储库类

import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
...

  @Modifying
  @Query("UPDATE Material m SET m.inventory_count = ?2 WHERE m.id = ?1")
  void updateMaterialInventory(Long id,int newInventoryAmount);

确保使用正确的导入。希望这有帮助。

蓟和煦
2023-03-14

@修改注释必须放置在updateMaterialInventory方法上,以及@Query注释,以让Spring-data知道查询不是用于选择值的查询,而是用于更新值的查询。

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

  • 我正在尝试更新数据库中的记录,但收到此错误 这是我的hql尝试 经过研究,我在方法的顶部添加了@修改注释,但错误仍然存在。请问怎么了?

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

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

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

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