2015-07-19 15 views
25

Điều này đã được yêu cầu một lần trước đó nhưng giải pháp không giải quyết được vấn đề. Tôi tạo ra một thử nghiệm JUnit:Không được hỗ trợ cho các hoạt động DML với truy vấn cập nhật JPA

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

Truy vấn các thử nghiệm trên được gọi là:

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

Lỗi:

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 

Trả lời

61

Các @Modifying chú thích phải được đặt vào phương pháp updateMaterialInventory, cùng với chú thích @Query, để cho Spring-data biết rằng truy vấn không phải là truy vấn được sử dụng để chọn giá trị, nhưng để cập nhật giá trị.

+2

lý do tại sao tôi nhận được "Thực thi cập nhật/xóa truy vấn" ngoại lệ khi cập nhật? – Kenji

+0

@Kenji Thêm nội dung này: @Transactional (tuyên truyền = Tuyên truyền.REQUIRED, readOnly = false) – user64141

1

Theo như tôi hiểu, bạn không nên sử dụng chú thích @Transactional trong lớp lưu trữ. Tìm câu trả lời dưới đây.

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

hãy chắc chắn để sử dụng hàng nhập khẩu đúng. hy vọng điều này là hữu ích.

Các vấn đề liên quan