Comment faire un timestamp comparaison avec JPA requête?

Nous devons nous assurer que seuls les résultats obtenus dans les 30 derniers jours sont retournés pour une requête JPQL. Prenons l'exemple suivant:

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 non fatale erreur de l'utilisateur> org.apache.openjpa.la persistance.ArgumentException: Une erreur s'est produite lors de l'analyse du filtre de requête 'SELECT msg DE BroadcastMessage msg OÙ msg.targetTime < CURRENT_TIMESTAMP ET msg.targetTime > {ts, '2010-04-18 04:15:37.827'}'. Message d'erreur: org.apache.openjpa.le noyau.jpql.TokenMgrError: Lexicale erreur à la ligne 1, colonne 217. Rencontré: "{" (123), après : ""

Aider!

Qu'est-ce que ts? Pourquoi avez-vous des crochets dans votre requête ? { ... }
Essayez d'utiliser un "JDBC syntaxe d'échappement" timestamp littéral comme indiqué dans les liens suivants. Il ressemble à DataNucleus suggestion est une bien meilleure solution. openjpa.apache.org/builds/latest/docs/manual/... publib.boulder.ibm.com/infocenter/cscv/v10r1/topic/...
Vous devriez ouvrir un rapport de bogue OpenJPA pour obtenir le code... ou doc fixe.

OriginalL'auteur Lightbeard | 2010-03-29