Como fazer uma comparação de registro de data e hora com a consulta JPA?
Pergunta
Precisamos garantir que apenas os resultados nos últimos 30 dias sejam retornados para uma consulta JPQL. Um exemplo a seguir:
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();
Aqui está o erro que recebemos:
<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 : ""
Ajuda!
Solução
Portanto, a consulta que você entra não é JPQL (que você pode ver referindo -se à especificação JPA). Se você deseja comparar um campo com uma data, você insira a data como um parâmetro para a consulta
msg.targetTime < CURRENT_TIMESTAMP AND msg.targetTime > :param
Isso não é SQL.
Outras dicas
Verifique se o seu código está sendo executado no contexto de um usuário que tenha acesso a BCS.Eu recomendo que você use spuserteken para representar um usuário em vez de privilégios elevados, já que o seu pool de aplicativos pode não ter acesso a BCS.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow