【问题标题】:org.h2.jdbc.JdbcSQLException: Method is only allowed for a queryorg.h2.jdbc.JdbcSQLException:方法只允许用于查询
【发布时间】:2016-04-12 04:24:03
【问题描述】:

我使用以下代码在我的数据库上运行查询。

@Repository
public interface PurchaseOrderRepository extends JpaRepository<PurchaseOrder, PurchaseOrderID> {

    @Query(value ="update PURCHASE_ORDER   set status='REJECTED'   where id=?1", nativeQuery = true)
    void RejectPO(Long id);
}

然后我只需在服务中调用此方法

@Service
public class SalesService {

    @Autowired
    PurchaseOrderRepository purchaseOrderRepository;
public void RejectPurchaseOrder(Long of) {

        purchaseOrderRepository.RejectPO(of);
    }
}

但我遇到了一个错误:

org.h2.jdbc.JdbcSQLException: Method is only allowed for a query. Use execute or executeUpdate instead of executeQuery; SQL statement:
update PURCHASE_ORDER   set status='REJECTED'   where id=? [90002-191]

问题是,我从未调用过executeQuery,我只是要求使用jpa 运行它。那么我该如何解决呢?

【问题讨论】:

    标签: java spring jpa


    【解决方案1】:

    为了让 JPA 实际运行修改数据库状态的自定义 @Query,该方法必须使用 @Modifying 进行注释,以告诉 JPA 使用 executeUpdate 等。

    而不是

    @Query(value ="update PURCHASE_ORDER   set status='REJECTED'   where id=?1", nativeQuery = true)
    void RejectPO(Long id);
    

    试试

    @Modifying
    @Query(value ="update PURCHASE_ORDER   set status='REJECTED'   where id=?1", nativeQuery = true)
    void RejectPO(Long id);
    

    详情请见http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.modifying-queries

    【讨论】:

      【解决方案2】:

      问题出在这一行:

       // Used only when select statement is used .
       @Query(value ="update PURCHASE_ORDER   set status='REJECTED'   where id=?1", nativeQuery = true)
          void RejectPO(Long id);
      

      您正在尝试update 架构,但您只使用了@Query 注释。

      当查询方法仅使用 @Query 注释时,Spring 在内部调用 executeQuery() 不用于 modify Schema 中的值。 executeQuery() 只负责执行select 查询。

      再添加一个注释,使您的@Query 能够更新:

       @Modifying  // add this annotation
       @Query(value ="update PURCHASE_ORDER   set status='REJECTED'   where id=?1", nativeQuery = true)
          void RejectPO(Long id);
      

      【讨论】:

        【解决方案3】:

        您收到 org.h2.jdbc.JdbcSQLException 消息,因为您没有将 @Modifying 注释应用到存储库方法 void RejectPO(Long id);。 这肯定可以解决问题:

        @Modifying
        @Query(value ="update PURCHASE_ORDER   set status='REJECTED' where id=?1", nativeQuery = true)
        void RejectPO(Long id);
        

        【讨论】:

          猜你喜欢
          • 2018-08-22
          • 2022-06-22
          • 2020-04-23
          • 2013-05-24
          • 1970-01-01
          • 1970-01-01
          • 2018-10-06
          • 1970-01-01
          • 2016-01-29
          相关资源
          最近更新 更多