使用子查询删除“in”过滤器

时间:2016-12-22 14:42:25

标签: java orm db2 persistence

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

日志记录是包含一些信息的对象(日志),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。

有谁能告诉我我做错了什么?

2 个答案:

答案 0 :(得分:1)

您应该为{<1}}执行SQL

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

答案 1 :(得分:0)

像这样修改您的查询

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