こんにちは、私は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
を行うものとする
のようなあなたのクエリを変更します。 hqlでサブクエリ内でlimitを使用することはできないようです。 http://stackoverflow.com/questions/2738880/how-to-set-a-limit-to-inner-query-in-hibernate –
JPAクエリは[JPQL(Java Persistence Query Language)](http: /docs.oracle.com/javaee/6/tutorial/doc/bnbtg.html)、SQLではなく、基礎となるDBの特定のSQL方言ではありません。 JPQLとSQLは意図的に似ていますが、同一ではありません。少なくとも、問合せには問題があります。JPQLには 'LIMIT'節がありません。 –
これは有効なDB2 SQL構文ではありません。有効な_is_は、DB2のバージョンとプラットフォームによって異なります。 – mustaccio