mvc example data java hibernate spring-mvc jpa hql

java - example - No es compatible con operaciones DML con consulta de actualización JPA



spring hibernate (2)

Esto ya se ha preguntado una vez, pero la solución no resolvió el problema. Estoy creando una prueba 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); }

La consulta a la que llama la prueba anterior es:

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

Error:

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


La anotación @Modifying debe colocarse en el método updateMaterialInventory , junto con la anotación @Query , para que Spring-data sepa que la consulta no es una consulta utilizada para seleccionar valores, sino para actualizar valores.


Por lo que yo entiendo, no deberías usar la anotación @Transactional en la clase de repositorio. Encuentra la respuesta a continuación.

Clase de servicio 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); }

Clase de repositorio

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

asegúrese de usar las importaciones correctas. Espero que esto sea útil.