【问题标题】:Java Date Hibernate cut off timeJava Date Hibernate 截止时间
【发布时间】:2011-01-21 13:10:37
【问题描述】:

我在 Oracle DB 中有一个日期类型列,它肯定包含日期和时间。但是当我试图在java应用程序中获取数据时,它会返回带有一堆零的日期而不是实时的。 在代码中它会是这样的:

SQLQuery sqlQuery = session.createSQLQuery("SELECT table.id, table.date FROM table");
List<Object[]> resultArray = sqlQuery.list();
Date date = (Date)resultArray[1];

如果是 2010 年 2 月 26 日 17:59:16 在 DB 我会得到 26-feb-2010 00:00:00 时间如何获得?

【问题讨论】:

    标签: java oracle hibernate date time


    【解决方案1】:

    可能有点晚了,但在我的情况下,解决方案是将@Temporal(TemporalType.DATE) 添加到我的日期字段中。

    @Temporal(TemporalType.DATE)
    private Date date;
    

    我们发现的另一个解决方案(当第一个不起作用时)是明确告诉休眠类型:

    @Type(type = "date")
    private Date date;
    

    【讨论】:

      【解决方案2】:

      我最近遇到了同样的问题。这是我的方法...

      所以在这种情况下,在 QueryImplementation 类中定义一个 for 循环,以便检查数据库表的所有列的类型。如果列名是 DATE 类型,则将 addScalar("columnName", new Timestamptype()) 附加到查询生成器。这样 Date 类型的 Columns 将在 java 应用程序中显示 TimeStamp。

      请在下面找到示例代码:

       SQLQuery hibernateQuery = getSession().createSQLQuery(sqlQuery);
      
              Set<String> columns = columnDataTypes.keySet();
         for (String column : columns) {
             if (columnDataTypes.get(column).equals(SqlType.DATE.name())) {
                 hibernateQuery.addScalar(column, new TimestampType());
             } else {
                 hibernateQuery.addScalar(column);
             }
         }
      

      希望这会有所帮助。

      拉克什。

      【讨论】:

        【解决方案3】:

        正如其他人已经说过的,您需要使用java.sql.Timestamp 来获取时间。

        但是,如果您在 Oracle 的 DATE 列上使用 @Temporal(TemporalType.TIMESTAMP) 注释,Hibernate 会抱怨并抛出架构验证错误。为避免这些情况,请像这样添加columnDefinition

        @Temporal(TemporalType.TIMESTAMP)
        @Column(name="EVENTTIME", columnDefinition="DATE")
        private Date eventTime;
        

        【讨论】:

        • 我对此赞不绝口!这应该是公认的答案!
        【解决方案4】:

        是的,它也可以正常工作 hibernate 3.3 ,使用 ojdbc6.jar 并在注释中将日期更改为时间戳 如下所示

        @Id
        @Temporal(TemporalType.TIMESTAMP)
        @Column(name = "TDATE", length = 7)
        public Date getTdate() {
            return this.tdate;
        }
        
        public void setTdate(Date tdate) {
            this.tdate = tdate;
        }
        

        【讨论】:

          【解决方案5】:

          我过去也遇到过这个问题。要解决它,请从以下位置更改您的休眠映射:

          <property name="timeStamp" type="java.util.Date">
              <column name="TIME_STAMP"/>
          </property>
          

          <property name="timeStamp" type="timestamp">
              <column name="TIME_STAMP"/>
          </property>
          

          您可以将 Hibernate 对象中的数据类型保留为 java.util.Date。

          【讨论】:

            【解决方案6】:

            我遇到了同样的问题(数据库中的 Oracle 日期类型)。

            以下映射对我有用:

            <property name="timeStamp" type="java.util.Date">
                <column name="TIME_STAMP"/>
            </property>
            

            【讨论】:

              【解决方案7】:

              也许你有this problem?确保你有最新的JDBC驱动,文件名应该是ojdbc5.jar。

              【讨论】:

                【解决方案8】:

                试试这个:

                session.createSQLQuery("SELECT table.id as i, table.date as d FROM table")
                  .addScalar("i", Hibernate.LONG)  // Or whatever type id is
                  .addScalar("d", Hibernate.TIMESTAMP);
                

                【讨论】:

                • 谢谢。现在它起作用了。但我讨厌我应该为所有返回的参数定义类型。我有很多...
                • 您可以尝试自定义方言。基本方言说“注册休眠类型以在标量 sqlquery 类型自动检测中默认使用”并且 Types.DATE 与 Hibernate.DATE 匹配 - 您可以对其进行子类化并将 Types.DATE 与 Hibernate.TIMESTAMP 匹配。
                【解决方案9】:

                我不是 Oracle 专家,但您可能需要 DateTime 列类型来获取时间戳。

                你需要使用java.sql.Timestamp JDBC类型。

                【讨论】:

                • 在 Oracle 中,DATE 数据类型包含日期和时间信息,很像 java.lang.Date
                猜你喜欢
                • 1970-01-01
                • 2019-10-28
                • 2021-07-12
                • 2020-09-30
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-10-06
                相关资源
                最近更新 更多