2014-04-22 2 views
2

J'ai deux colonnes dans ma table, créées (TIMESTAMP) et à vie (BIGINT). La durée de vie est représentée en secondes. Je voudrais ajouter la colonne de durée de vie à la colonne timestamp et comparer ce résultat à une autre date.Derby SQL Timestamp Arithmétique et syntaxe d'échappement JDBC

Je référencent derby manual et trouvé un soutien pour TIMESTAMPADD dans la section "syntaxe d'échappement JDBC pour le mot clé fn":

{fn FunctionCall} TIMESTAMPADD (intervalle, integerExpression, timestampExpression)

Okay donc j'ai essayé:

SELECT i.messageId FROM ServerMessageEntity i 
WHERE {fn TIMESTAMPADD(SQL_TSI_SECOND, i.lifetime, i.created)} > :now 

*: est maintenant un paramètre je passe par:

query.setParameter 

Unfortunitly-je obtenir l'exception suivante:

Exception Description: Erreur de syntaxe analyse syntaxique de la requête [SELECT i.messageId DE ServerMessageEntity i OÙ {fn TIMESTAMPADD (SQL_TSI_SECOND, i.lifetime, i.created)}>: maintenant], inattendu char [{].

Il semble que la solution serait d'ajouter les secondes à l'horodatage créé et que le résultat soit un autre horodatage. Toute aide ou syntaxe pour ce faire serait appréciée. Merci!

Autres informations: J'utilise 12c Oracle TopLink (12.1.2) pour ORM et Derby 10.10.2.0

Répondre

0

Il se trouve que mon problème utilisait "@NamedQuery" pour stocker la requête. J'ai expérimenté en utilisant la méthode "createNativeQuery" et j'ai pu obtenir le résultat que je voulais

String sql = "SELECT MESSAGEID FROM \"TABLE\".SERVERMESSAGES WHERE {fn TIMESTAMPADD(SQL_TSI_SECOND, LIFETIME, CREATED)} < ?" 
Query query = entityManager.createNativeQuery(sql);