使用 "in" 过滤器的子查询删除

Delete with subquery for "in" filter

大家好,我是 javax.persistance 的新手。主要问题是我想删除数据库中的旧(不是最后 10000 条)记录(按日期降序排列)。我无法在我通常期望的 sql 语句中执行子查询:

Logging是一个包含一些信息的对象(log),occuredAt字段是写入数据库的日期(date+time)

数据库: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.createNativeQuery SQL

em.createQuery 适用于 JP QL(Java 持久性查询语言),不适用于 SQL

像这样修改您的查询

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