【问题标题】:How to add minutes to a timestamp column in Hibernate?如何在 Hibernate 的时间戳列中添加分钟?
【发布时间】:2015-05-20 18:44:54
【问题描述】:

我有两个数据库列,其中一个是 Timestamp 类型,另一个是 Number 持有分钟数。我有一个要求,我需要添加两列,即在时间戳值中添加分钟并将其与同样是 Timestamp 的参数进行比较。以下是我当前失败的NamedQuery

任何指针将不胜感激。我想使用Named Query 而不是Native 来实现这一点。

@NamedQuery(name = "Company.findAllProducts", query = "SELECT p FROM Product p JOIN FETCH p.productDetail pd WHERE (pd.createTimestamp + pd.minutesToActive) > :incomingTimestamp")

异常堆栈跟踪:

Parameter value [2015-05-20T14:52:08.764Z] did not match expected type [java.lang.Integer (n/a)]
java.lang.IllegalArgumentException: Parameter value [2015-05-20T14:52:08.764Z] did not match expected type [java.lang.Integer (n/a)]
        at org.hibernate.ejb.AbstractQueryImpl.validateBinding(AbstractQueryImpl.java:382) ~[hibernate-entitymanager-4.2.18.Final-redhat-2.jar!/:4.2.18.Final-redhat-2]
        at org.hibernate.ejb.AbstractQueryImpl.registerParameterBinding(AbstractQueryImpl.java:356) ~[hibernate-entitymanager-4.2.18.Final-redhat-2.jar!/:4.2.18.Final-redhat-2]
        at org.hibernate.ejb.AbstractQueryImpl.registerParameterBinding(AbstractQueryImpl.java:347) ~[hibernate-entitymanager-4.2.18.Final-redhat-2.jar!/:4.2.18.Final-redhat-2]
        at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:373) ~[hibernate-entitymanager-4.2.18.Final-redhat-2.jar!/:4.2.18.Final-redhat-2]
        at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:74) ~[hibernate-entitymanager-4.2.18.Final-redhat-2.jar!/:4.2.18.Final-redhat-2]

【问题讨论】:

  • 您可能必须将其设为本机查询,因为 HQL 没有(任何?)日期算术函数。您的目标是哪个 RDBMS?不幸的是,ANSI SQL 也没有真正包含任何用于此目的的标准函数,因此查询将是特定于供应商的。
  • @MickMnemonic 我正在使用 Oracle。是的,使用本机查询我可能能够实现这一点,但我真的想使用命名查询来实现它。

标签: java hibernate hql


【解决方案1】:

看起来NamedQuery 无法使用Integer 添加Timestamp 值。

请检查是否可以将“Number”(分钟偏移字段)更改为Timestamp 字段。否则,您可以在查询之外进行添加。

您能否提供更多详细信息,例如 '2015-05-20T14:52:08.764Z' 这个值来自 pd.createTimestamp 吗?另外,您是否尝试过直接在数据库中运行此 SQL,是否有效?

【讨论】:

  • 该值将作为传入时间戳的参数。它在创建 SQL 之前失败(所以还没有 SQL),除非你的意思是我写了一个我没有写的本机查询。
  • 我认为问题出在 SQL 本身(特别是这部分, (pd.createTimestamp + pd.minutesToActive) )。您能否尝试在数据库中运行本机 SQL 并检查它是否正常。我在这里假设,如果 NamedQuery 必须工作,则相同的查询必须在本机工作,但查询参数除外。您可以尝试运行此.. SELECT p FROM Product p JOIN FETCH p.productDetail pd WHERE (pd.createTimestamp + pd.minutesToActive) > '2015-05-20T14:52:08.764Z'
猜你喜欢
  • 2010-09-20
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 2017-10-22
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多