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

Posted

技术标签:

【中文标题】在 JPQL 查询中执行更新/删除查询【英文标题】:Executing an update/delete query in the JQPL query 【发布时间】:2019-07-16 06:58:46 【问题描述】:

我在 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

【问题讨论】:

尝试使用 org.springframework.transaction.annotation.Transactional 而不是 javax.transaction.Transactional 谢谢,我修复了事务注释:@Transactional @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 insertUser(@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 prices); @SInsansun 随时添加您的评论作为答案,以便人们对其进行投票并且您可以接受。 【参考方案1】:

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

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

OrphanRemovalAction AbstractEntityInsertAction 实体更新操作 QueuedOperationCollectionAction CollectionRemoveAction CollectionUpdateAction CollectionRecreateAction EntityDeleteAction

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

【讨论】:

【参考方案2】:

你必须打开一个会话来询问 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);

【讨论】:

以上是关于在 JPQL 查询中执行更新/删除查询的主要内容,如果未能解决你的问题,请参考以下文章

条件查询,SQL,JPQL,HQL

JPQL 更新查询如何处理@Version 字段?

如何使用 JPQL 创建动态更新查询?

JPQL 更新查询以更新实体而不使用主键

更新同一张表的 JPQL 查询的性能改进

JPQL 查询删除不接受声明的 JOIN?