Este ha sido preguntado una vez antes, pero la solución no resuelve el problema. Estoy creando una prueba de 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 de la prueba anterior es la llamada es:

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

De 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
InformationsquelleAutor Drew1208 | 2015-07-19

3 Comentarios

  1. 77

    La @Modifying anotación debe ser colocado en el updateMaterialInventory método, junto a la @Query anotación, para que la Primavera-datos sabemos que la consulta no es una consulta que se utiliza para seleccionar los valores, pero a la actualización de valores.

    • por qué me sale «la Ejecución de una actualización/consulta de eliminación» excepción de la actualización?
    • Añadir esto: @Transactional(propagación = Propagación.Se REQUIERE, readOnly = false)
  2. 1

    Tal y como yo lo entiendo, usted no debe usar @Transactional anotación en el repositorio de la clase. Encontrar la siguiente respuesta.

    Servicio Impl clase

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

    Repositorio de clase

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

    asegurarse del uso correcto de las importaciones. espero que esto sea útil.

  3. 0
    @Transactional
    @Modifying
    @Query(DELETE_INVOICE_BY_NUMBER)
    public void deleteInvoiceByNumber(@Param("number") int number);

    Esto funcionó para mí, Pero sin @Transaccional en el repositorio de la clase se dará un error.

Dejar respuesta

Please enter your comment!
Please enter your name here