2017-08-31 108 views
2

我有一個表,填充了一個導入文件。 現在我需要聲明的相關實體AUDIT和我們試圖創建一個程序,在審計表中插入revinfo,通過這種方式:從DB最大REV和最大RevTS將Envers修訂添加到現有和未審計的表

@Query(value="select max(rev) from revinfo",nativeQuery=true) 
int findMaxRev(); 

@Query(value="select max(revtstmp) from revinfo",nativeQuery=true) 
Long findMaxrevtstmp(); 

提取物

在這個數據我們添加一個+1值,並嘗試將其設置在此查詢:

@Query(value="insert into revinfo (`rev`, `revtstmp`) values (:rev, :revtstmp)", nativeQuery=true) 
     void addRevInfo(@Param("rev") int rev, @Param("revtstmp")Long revtstmp); 

@Query(value="insert into entity_h (id, audit_revision, action_type, audit_revision_end, audit_revision_end_ts) " 
    + "values (:id, :rev, 0, null, '2017-08-31 10:45:37')", nativeQuery=true) 
    void addEnvers(@Param("id")long id, @Param("rev")int rev); 

但是,當我們運行addRevInfo查詢,我們得到這個錯誤:

`ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - Can not issue data manipulation statements with executeQuery()`. 

如果我們直接在MySQLWorkbench執行與此相同的查詢,沒有問題插件運行。

怎麼了?

回答

2

嘗試將此添加到您插入查詢:

@Modifying(clearAutomatically = true) 
@Query("....") 

隨着該EntityManager的刷新更改,否則不,它允許使用的executeUpdate()代替exectueQuery()的作品

the SQL statement, which returns a single ResultSet object

的executeUpdate改爲

for SQL statement, which may be an INSERT, UPDATE, or DELETE statement or an SQL statement that returns nothing, such as an SQL DDL statement.