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

Dre*_*208 40 java hibernate jpa hql spring-mvc

这已被问过一次,但解决方案没有解决问题.我正在创建一个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);
    }
Run Code Online (Sandbox Code Playgroud)

上面测试的调用是:

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

错误:

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
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 82

@Modifying注释必须放在该updateMaterialInventory方法,沿途的@Query注解,让Spring的数据知道查询不是用来选择值的查询,但更新值.

  • 为什么我在更新时遇到"执行更新/删除查询"异常? (2认同)
  • @Kenji 添加这个:@Transactional(propagation = Propagation.REQUIRED, readOnly = false) (2认同)