java - 不支持使用 JPA 更新查询的 DML 操作

标签 java hibernate spring-mvc jpa hql

这已经被问过一次,但解决方案没有解决问题。我正在创建一个 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

最佳答案

@Modifying 注释必须放在 updateMaterialInventory 方法上,连同 @Query 注释,让 Spring-data 知道该查询不是用于选择值的查询,而是用于更新值的查询。

关于java - 不支持使用 JPA 更新查询的 DML 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31503103/

相关文章:

Java-为什么这个程序不抛出并发修改异常

java - <T> 和 <> 之间的区别

java - 我怎么知道谁调用了 System.gc()?

java - Hibernate:条件查询未正确评估

java - 无法建立 JDBC 连接

java - 无法访问 SwaggerUI index.html 页面,但可以打开 api-docs (Spring - Boot)

java - 如何支持连接池供应商特定的 DataSourceProperties 配置

hibernate - 如何在 hibernate 中使用二级实体缓存来缓存整个表。?

java - Spring 验证错误生成

java - 即使添加 Maven 依赖项后,NoClassDefFound 也会出现错误