10

我们需要确保 JPQL 查询只返回最近 30 天内的结果。一个例子如下:

Date now = new Date();
Timestamp thirtyDaysAgo = new Timestamp(now.getTime() - 86400000*30);

Query query = em.createQuery(
  "SELECT msg FROM Message msg "+
  "WHERE msg.targetTime < CURRENT_TIMESTAMP AND msg.targetTime > {ts, '"+thirtyDaysAgo+"'}");
List result = query.getResultList();

这是我们收到的错误:

<openjpa-1.2.3-SNAPSHOT-r422266:907835 非致命用户错误> org.apache.openjpa.persistence.ArgumentException:解析查询过滤器时发生错误 'SELECT msg FROM BroadcastMessage msg WHERE msg.targetTime < CURRENT_TIMESTAMP AND msg.targetTime > {ts,'2010-04-18 04:15:37.827'}'。错误消息:org.apache.openjpa.kernel.jpql.TokenMgrError:第 1 行第 217 列的词法错误。遇到:“{”(123),之后:“”

帮助!

4

2 回答 2

14

因此,您输入的查询不是 JPQL(您可以通过参考 JPA 规范看到)。如果要将字段与日期进行比较,则输入日期作为查询的参数

msg.targetTime < CURRENT_TIMESTAMP AND msg.targetTime > :param

这不是 SQL。

于 2010-03-29T17:33:07.587 回答
10

您使用的 OpenJPA 版本可能不支持 JDBC 转义语法。最新 1.2.x 版本的文档在这里: http: //openjpa.apache.org/builds/1.2.2/apache-openjpa-1.2.2/docs/manual/manual.html#jpa_langref_lit

前面提到的文档是指 OpenJPA 2.0.0(最新)的文档:http: //openjpa.apache.org/builds/latest/docs/manual/jpa_langref.html#jpa_langref_lit

那就是说你有什么理由要在你的 JPQL 中注入一个字符串?类似以下代码段的内容呢?

Date now = new Date();
Date thirtyDaysAgo = new Date(now.getTime() - (30 * MS_IN_DAY));

Query q = em.createQuery("Select m from Message m " 
    + "where m.targetTime < :now and m.targetTime > :thirtyDays");
q.setParameter("now", now); 
q.setParameter("thirtyDays", thirtyDaysAgo);

List<Message> results = (List<Message>) q.getResultList();
于 2010-04-01T02:38:58.000 回答