Question

Nous devons nous assurer que seuls les résultats au cours des 30 derniers jours sont renvoyés pour une requête JPQL. Voici un exemple:

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();

Voici l'erreur que nous recevons:

<openjpa-1.2.3-SNAPSHOT-r422266:907835 nonfatal user error> org.apache.openjpa.persistence.ArgumentException: An error occurred while parsing the query filter 'SELECT msg FROM BroadcastMessage msg WHERE msg.targetTime < CURRENT_TIMESTAMP AND msg.targetTime > {ts, '2010-04-18 04:15:37.827'}'. Error message: org.apache.openjpa.kernel.jpql.TokenMgrError: Lexical error at line 1, column 217.  Encountered: "{" (123), after : ""

Aide

Était-ce utile?

La solution

Ainsi, la requête que vous entrez est pas JPQL (que vous pouvez voir en se référant à la spécification JPA). Si vous voulez comparer un champ avec une date alors que vous entrez la date en tant que paramètre à la requête

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

C'EST PAS SQL.

Autres conseils

La syntaxe d'échappement JDBC ne peut pas être pris en charge dans la version de OpenJPA que vous utilisez. La documentation de la dernière version 1.2.x est ici: http://openjpa.apache.org/builds/1.2.2/apache-openjpa-1.2.2/docs/manual/manual.html#jpa_langref_lit .

La documentation mentionné précédemment fait référence à la documentation pour OpenJPA 2.0.0 (dernière): http://openjpa.apache.org/builds/latest/docs/manual/jpa_langref.html#jpa_langref_lit

Cela dit est-il une raison pour laquelle vous voulez injecter une chaîne dans votre JPQL? Qu'en est-il quelque chose comme l'extrait suivant?

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();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top