在JQPL查询中执行更新/删除查询

时间:2019-02-22 08:15:57

标签: spring-boot spring-data jpql

我在JPQL中有这样的插入查询:

@Modifying
    @Query(value = "insert into Product_Category (product_id, category_id , description , numberOfProduct, image, price ) values (:product_id, :category_id, :description, :numberOfProduct, :image, :price)", nativeQuery = true)
    void insertProduct(@Param("product_id") int product_id, @Param("category_id") int category_id,
            @Param("description") String description, @Param("numberOfProduct") int numberOfProduct,
            @Param("image") String image, @Param("price") int price);

我不理解为什么这不起作用。我有这个错误:

javax.persistence.TransactionRequiredException: Executing an update/delete query

2 个答案:

答案 0 :(得分:1)

您必须打开一个会话来询问BD

import org.springframework.transaction.annotation.Transactional.

    @Transactional //try to add this annotation 
    @Modifying
    @Query(value = "insert into Product_Category (product_id, category_id , description , numberOfProduct, image, price ) values (:product_id, :category_id, :description, :numberOfProduct, :image, :price)", nativeQuery = true)
    void insertProduct(@Param("product_id") int product_id, @Param("category_id") int category_id,
            @Param("description") String description, @Param("numberOfProduct") int numberOfProduct,
            @Param("image") String image, @Param("price") int price);

答案 1 :(得分:0)

您需要使用@Transactional将语句包装起来。要符合JPA,您应该使用javax.transaction.Transactional,尽管在某些版本的spring-data组合中,如果javax.transaction.Transactional引起问题,您可以尝试使用org.springframework.transaction.annotation.Transactional

请记住,在JPA中,一切都与实体状态转换有关。修改实体时,hiberante会更新持久性上下文并定期刷新它。 发生的顺序是:

  • OrphanRemovalAction
  • AbstractEntityInsertAction
  • EntityUpdateAction
  • QueuedOperationCollectionAction
  • CollectionRemoveAction
  • CollectionUpdateAction
  • CollectionRecreateAction
  • EntityDeleteAction

因此,插入和更新自然是在删除之前。 如果您有执行以下操作的代码:删除+插入,则实际上将在删除之前执行插入操作。在这种情况下,正确的方法是获取和更新。