我使用以下代码在我的数据库上运行查询。
@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
来运行它。那我怎么解决呢?
答案 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);