org.h2.jdbc.JdbcSQLException:方法仅允许查询

时间:2016-04-12 04:24:04

标签: java spring jpa

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

@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来运行它。那我怎么解决呢?

3 个答案:

答案 0 :(得分:7)

为了让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

答案 1 :(得分: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不用于executeQuery()模式中的值。 select仅负责执行@Query次查询。

添加一个注释,使您的 @Modifying // add this annotation @Query(value ="update PURCHASE_ORDER set status='REJECTED' where id=?1", nativeQuery = true) void RejectPO(Long id); 能够更新:

public class DialogBoxLogInPop extends DialogBox implements View.OnClickListener {
//...some code...
}

答案 2 :(得分:0)

您将收到org.h2.jdbc.JdbcSQLException消息,因为您没有将@Modifying注释应用于存储库方法define day = 1 define clock = 7 # Display Time and Day screen timeclock(): vbox: xpos 0.0 yalign 0.0 text _("Time: [clock]:00") size 40 text _("Day: [day]") size 30 textbutton _("Wait 1-Hour"): action Function(correctTime) text_size 10 init python: def correctTime(): global day global clock if clock <= 22: clock += 1 else: clock = 0 day += 1 。 这肯定可以解决问题:

void RejectPO(Long id);