Derby SQL Timestamp算术和JDBC转义语法

时间:2014-04-22 16:56:51

标签: sql jdbc derby toplink

我的表中有两列,Created(TIMESTAMP)和生命周期(BIGINT)。生命周期表示为秒。我想将life列添加到timestamp列,并将该结果与另一个日期进行比较。

我引用了derby manual,并在“fn关键字的JDBC转义语法”部分找到了对TIMESTAMPADD的支持:

  

{fn functionCall}   TIMESTAMPADD(interval,integerExpression,timestampExpression)

好的,所以我试过了:

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

* :现在是我传入的参数:

query.setParameter

不幸的是,我得到以下例外:

  

异常说明:解析查询时出现语法错误[SELECT   i.messageId FROM ServerMessageEntity i WHERE {fn   TIMESTAMPADD(SQL_TSI_SECOND,i.lifetime,i.created)}> :现在],   意外的字符[{]。

似乎解决方案是将秒添加到创建的时间戳,并将结果作为另一个时间戳。任何有关如何执行此操作的帮助或语法将不胜感激。谢谢!

其他信息:我正在使用Oracle TopLink 12c(12.1.2)进行ORM和Derby 10.10.2.0

1 个答案:

答案 0 :(得分:0)

事实证明我的问题是使用“@NamedQuery”来存储查询。我通过使用“createNativeQuery”方法进行了实验,并且能够得到我想要的结果

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