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!

Foi útil?

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
scroll top