2016-12-22 59 views
0

嗨,那裏我是javax.persistance的新手。主要的問題是我想刪除我的數據庫中的舊(不是最後的10000)記錄(按日期desc排序)。我無法在我通常所期望的sql語句中執行子查詢:用「in」過濾器的子查詢刪除

日誌記錄是一個包含一些信息的對象(日誌),occuredAt字段是寫入日期(日期+時間)的日期數據庫

數據庫:如果DB2是很重要的

SQL:

DELETE FROM Logging WHERE id NOT IN (SELECT id FROM Logging ORDER BY occuredAt DESC LIMIT 10000) 

這是我的代碼,我試圖執行。

EntityManager em = getEntityManager(); 
String sql = String.format("DELETE FROM %1$s WHERE id NOT IN (SELECT id FROM %1$s ORDER BY occuredAt DESC LIMIT %2$s)",Logging.class.getName(), 10000);     
Query qry = em.createQuery(sql); 
return qry.executeUpdate(); 

但是,這是拋出一個ArgumentException。

有人可以告訴我我做錯了什麼嗎?

+0

看看這個。看起來你不能在hql的子查詢中使用限制。 http://stackoverflow.com/questions/2738880/how-to-set-a-limit-to-inner-query-in-hibernate –

+0

JPA查詢以[Java持久性查詢語言(JPQL)](http:///docs.oracle.com/javaee/6/tutorial/doc/bnbtg.html),而不是SQL,當然也不在底層數據庫的特定SQL方言中。 JPQL和SQL有意相似,但不完全相同。至少,您的查詢存在問題,因爲JPQL沒有「LIMIT」子句。 –

+0

這不是有效的DB2 SQL語法;什麼_is_有效取決於DB2版本和平臺。 – mustaccio

回答

1

您須爲SQL

em.createQueryem.createNativeQuery是JP QL(Java持久化查詢語言),而不是SQL

0

修改您的查詢像這樣

DELETE FROM Logging WHERE id NOT IN (SELECT id FROM Logging ORDER BY occuredAt DESC fetch first 10000 rows only)