2015-07-19 11 views
25

के साथ डीएमएल संचालन के लिए समर्थित नहीं है यह एक बार पहले पूछा गया है लेकिन समाधान ने इस मुद्दे को हल नहीं किया है।जेपीए अपडेट क्वेरी

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

क्वेरी ऊपर परीक्षण बुला रहा है है:: मैं एक JUnit परीक्षण बनाने रहा

@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 

उत्तर

61

@Modifying एनोटेशन updateMaterialInventory विधि पर रखा जाना चाहिए, @Query एनोटेशन के साथ, स्प्रिंग-डेटा को यह जानने के लिए कि क्वेरी मानों का चयन करने के लिए उपयोग की जाने वाली क्वेरी नहीं है, लेकिन मानों को अपडेट करने के लिए।

+2

मुझे अपडेट पर अपडेट "अपडेट/डिलीट क्वेरी" अपवाद क्यों मिलता है? – Kenji

+0

@ केंजी इसे जोड़ें: @ ट्रांसेक्शनल (प्रचार = प्रचार। आवश्यक, पढ़ा केवल = झूठा) – user64141

1

जहां तक ​​मैं समझता हूं, आपको भंडार वर्ग में @Transactional एनोटेशन का उपयोग नहीं करना चाहिए। नीचे जवाब प्राप्त करें।

Service Impl class

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

Repository class

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

सही आयात का उपयोग सुनिश्चित करें। उम्मीद है कि यह सहायक है।

संबंधित मुद्दे