当前位置: 首页 > 知识库问答 >
问题:

org.h2.jdbc.JdbcSQLExc0019:方法只允许用于查询

闽阳州
2023-03-14

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

@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]

问题是,我从来没有调用执行查询,我只是要求使用jpa运行它。那我该怎么解决呢?

共有3个答案

施令雪
2023-03-14

你得到了组织。h2。jdbc。JdbcSQLException消息,因为您没有将@Modifying注释应用于存储库方法void RejectPO(长id) 。这肯定会解决问题:

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

熊哲圣
2023-03-14

这一行的问题在于:

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

您正在尝试更新模式,但您只使用了@Query注释。

当查询方法仅用@query注释时,Spring内部调用executeQuery(),它不用于修改架构中的值executeQuery()只负责执行select查询。

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

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

谈桐
2023-03-14

为了让JPA实际运行修改数据库状态的定制@Query,该方法必须用@modify注释,以告诉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-查询详细信息。

 类似资料:
  • 我有我的存储库,其中有以下功能: 当我触发此函数时,我得到错误: 如果这些信息有用的话,我在上加入了这个表(ccid代表公司客户id),它看起来是这样的。但同时,我也可以使用此列进行选择,而且效果很好: 我明白了,我需要使用或,但我只是学习它,我试图在互联网上找到它,但没有找到任何东西。那么,我该如何修复这个错误呢?感谢答案! 以下是回购协议的完整代码:

  • 问题内容: 我正在尝试为我的角度应用程序启用oauth2令牌获取。我的配置运行正常(身份验证对于所有请求均正常运行,令牌提取也正常运行),但是有一个问题。 CORS请求要求在将GET OPTIONS请求发送到服务器之前。更糟糕的是,该请求不包含任何身份验证标头。我希望此请求始终返回200状态,而无需在服务器上进行任何身份验证。可能吗?也许我想念一些东西 我的Spring安全配置: angular

  • 问题内容: 我打算使用Ajax将跨域请求发送到soap Web服务。Web服务的URL是:http://example1.asmx?op = GetVOD 我的代码: 在IIS 7服务器端,我已经将这些行添加到文件web.config中 当我在Chrome上运行客户端代码时,出现405错误: 有谁知道如何解决这个问题? 预先感谢 问题答案: 听起来像Web DAV正在阻碍。这是删除它的配置: ht

  • 我想验证只包含Select查询的字符串。不管怎么说,还是要这么做的??查询

  • 我有一个restcontroller和post方法,带有以下url和json请求。http://server/member/sc/v1/limited-liability/medicare 使用post方法和json请求在本地触发请求时,获得正确的响应。但在docker中以spring boot应用程序的形式运行会将异常作为不允许的方法抛出。最初,我将这个docker服务部署为put方法。现在我转

  • 我有一个用Swagger描述的POSTendpoint,我希望这个endpoint也有查询参数。我们使用1.2 swagger格式是因为传统原因。我们使用3scale,它托管文档,您可以在他们的web UI中编辑您的swagger。然而,当我试图保存文档时,它给我以下错误。 < code>JSON规范不能在同一方法上有paramType='body '和param type = ' query '