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.
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
Vous devez vous connecter pour publier un commentaire.
De sorte que la requête que vous avez entrée n'est pas JPQL (que vous pouvez voir en se référant à la JPA spec). Si vous souhaitez comparer un champ de Date, puis vous saisissez la Date en tant que paramètre à la requête
CE N'EST PAS SQL.
Oui, vous avez raison; j'avais oublié à quel spécifiques à SGBDR JPQL. Conseiller serait encore pour éviter une telle syntaxe, car, comme par la JPA spec, vous êtes dépendante sur le pilote JDBC de le soutenir, et que la requête est en fait beaucoup plus propre avec un paramètre.
OriginalL'auteur DataNucleus
JDBC syntaxe d'échappement ne peuvent pas être pris en charge dans la version de OpenJPA que vous utilisez. La documentation de la dernière 1.2.x version 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ée précédemment fait référence à la documentation pour OpenJPA 2.0.0 (le dernier): http://openjpa.apache.org/builds/latest/docs/manual/jpa_langref.html#jpa_langref_lit
Que dit est-il une raison pourquoi vous voulez injecter une chaîne de caractères dans votre JPQL? Que penser de quelque chose comme l'extrait suivant?
Pour info, en JPQL, vous pouvez utiliser un TypedQuery pour éviter les coulées.
OriginalL'auteur Mike