it-roy-ru.com

Не поддерживается для операций DML с запросом на обновление JPA

Это было задано один раз, но решение не решило проблему. Я создаю тест 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
29
Drew1208

Аннотация @Modifying должна быть размещена в методе updateMaterialInventory вместе с аннотацией @Query, чтобы сообщить Spring-data, что запрос - это не запрос, используемый для выбора значений, а для обновления значений.

71
JB Nizet

Насколько я понимаю, вы не должны использовать аннотацию @Transactional в классе репозитория. Найдите ответ ниже.

Сервис Импл класс

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);

убедитесь, что вы используете правильный импорт. надеюсь, что это полезно.

1
tk_
@Transactional
@Modifying
@Query(DELETE_INVOICE_BY_NUMBER)
public void deleteInvoiceByNumber(@Param("number") int number);

Это сработало для меня, но без @Transactional в классе репозитория это выдает ошибку.

0
Champika Wijesundara