Non pris en charge pour les opérations DML avec JPA update query
cela a été demandé une fois auparavant mais la solution n'a pas résolu le problème. Je suis entrain de créer un test Unitaire:
@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 requête que le test ci-dessus appelle est:
@Query("UPDATE Material m SET m.inventory_count = ?2 WHERE m.id = ?1")
void updateMaterialInventory(Long id,int newInventoryAmount);
Erreur:
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
26
demandé sur
tk_
2015-07-19 18:58:59
2 réponses
@Modifying
l'annotation doit être placée sur le updateMaterialInventory
méthode, le long de la @Query
annotation, pour faire savoir à Spring-data que la requête n'est pas une requête utilisée pour sélectionner des valeurs, mais pour mettre à jour des valeurs.
66
répondu
JB Nizet
2015-07-19 16:20:27
autant que je sache, vous ne devriez pas utiliser @Transactional
annotation dans la classe de dépôt. Trouver ci-dessous la réponse.
classe de service 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);
}
classe de dépôt
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);
assurez-vous d'utiliser la bonne importations. espérons que cela est utile.
1
répondu
tk_
2017-12-18 01:31:53