Necesitamos asegurarnos de que solo se devuelven resultados en los últimos 30 días para una consulta JPQL. Un ejemplo es el siguiente:¿Cómo hacer una comparación de marca de tiempo con la consulta JPA?
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();
Aquí está el error que recibimos:
<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 : ""
Ayuda!
¿Qué es ts? ¿Por qué tienes paréntesis en tu consulta? {...} – Rick
Intentando utilizar un literal de marca de tiempo "sintaxis de escape JDBC" como se documenta en los siguientes enlaces. Parece que la sugerencia de DataNucleus es una solución mucho mejor. http://openjpa.apache.org/builds/latest/docs/manual/jpa_langref.html#jpa_langref_lit http://publib.boulder.ibm.com/infocenter/cscv/v10r1/topic/com.ibm.cloudscape.doc /rrefjdbc41784.html#rrefjdbc41784 – Lightbeard
Debería abrir un error en OpenJPA para obtener el código ... o el documento corregido. – Rick