2016-12-22 9 views
0

こんにちは、私はjavax.persistanceを初めて使用しています。主な問題は、データベース内の古い(10000ではなく)古いレコードを削除したいということです(日付descの順)。"in"フィルタのサブクエリで削除

ロギングはいくつかの情報を持つオブジェクト(ログ)であり、occuredAtフィールドはオブジェクトに書き込まれた日付(日付+時刻)です。これは、通常のSQL文でサブクエリできません。データベース

データベース: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を投げかけています。

誰かが私が間違っていることを教えてもらえますか?あなたは

em.createQuery SQL

ため em.createNativeQueryを行うものとする

+0

のようなあなたのクエリを変更します。 hqlでサブクエリ内でlimitを使用することはできないようです。 http://stackoverflow.com/questions/2738880/how-to-set-a-limit-to-inner-query-in-hibernate –

+0

JPAクエリは[JPQL(Java Persistence Query Language)](http: /docs.oracle.com/javaee/6/tutorial/doc/bnbtg.html)、SQLではなく、基礎となるDBの特定のSQL方言ではありません。 JPQLとSQLは意図的に似ていますが、同一ではありません。少なくとも、問合せには問題があります。JPQLには 'LIMIT'節がありません。 –

+0

これは有効なDB2 SQL構文ではありません。有効な_is_は、DB2のバージョンとプラットフォームによって異なります。 – mustaccio

答えて

1

はJP QL(れるJava Persistenceクエリ言語)のためではなく、SQL

ため
0

はこれを見てください、この

DELETE FROM Logging WHERE id NOT IN (SELECT id FROM Logging ORDER BY occuredAt DESC fetch first 10000 rows only) 
関連する問題