【问题标题】:Oracle function returns date but no time when called via JPQL通过 JPQL 调用 Oracle 函数返回日期但不返回时间
【发布时间】:2012-05-03 23:00:02
【问题描述】:

我有一个 Oracle 函数,它接受一个日期作为参数,并返回一个日期。函数是这样的:

FUNCTION my_func(par1 IN DATE, par2 IN NUMERIC) RETURN DATE AS
ret_val DATE;
BEGIN
....
END;

我需要在我的 Java 应用程序中调用此函数,目前正在使用 JPQL。该代码适用于在 JBoss 5 上运行的 Web 应用程序,如下所示:

   Query q = entityMng.createNativeQuery("SELECT MY_FUNC(?1,?2) FROM DUAL");
   java.util.Date now = new Date();
   long param2 = 110L;
   q.setParameter(1, now);
   q.setParameter(2, param2);
   java.sql.Date retSql = null;
   Object obj = q.getSingleResult();
   if (obj != null) {
      retSql = (java.sql.Date) obj;
   }

执行代码后,retSql 变量包含正确的日期,但有一个时间 = 00.00.000。即使使用java.util.Date 而不是java.sql.Date 作为retSql 的类型,我也会获得相同的行为。

在调查这个问题时,我发现了这个 SO 帖子 How to convert correctly an Oracle Date field into java.util.Date through JPA,但我不明白如何在我的情况下使用“addScalar”。

任何帮助将不胜感激,在此先感谢。

【问题讨论】:

  • Java Date 类似乎没有时间部分。尝试将您的“现在”变量声明为时间戳,看看是否可以解决问题。

标签: java oracle date jpa jpql


【解决方案1】:

尝试在您的函数中返回 TIMESTAMP,而不是 DATE。 DATE 现在只是 Oracle 中的日期,而 TIMESTAMP 应该用于日期/时间。您可以在 JDBC 中设置一个向后兼容性标志来控制它。

您使用的是哪个 JPA 提供程序? EclipseLink 应该会自动处理这个问题。

【讨论】:

  • 请注意,oracle 和 java 在此域中的最佳匹配可以说是 TIMESTAMP(3) 和 java.util.Date,因为两者具有相同的精度(高达毫秒)...如果您看到你在执行过程中得到了 java.sql.Timestamp 对象,小心!将 Timestamp 实例视为 Date 时可能会出现问题(请参阅 javadoc 中的介绍 docs.oracle.com/javase/1.4.2/docs/api/java/sql/Timestamp.html))
【解决方案2】:

如何使用 XMLAdapter;

公共类 DateAdapter 扩展 XmlAdapter {

// the desired format
private String pattern = "yyyy-MM-dd HH:mm:ss";

    /*few more formats http://www.xyzws.com/javafaq/how-to-use-simpledateformat-class-formating-parsing-date-and-time/142    */

public String marshal(Date date) throws Exception {

    return new SimpleDateFormat(pattern).format(date);

}

public Date unmarshal(String dateString) throws Exception {


    return new SimpleDateFormat(pattern).parse(dateString);

}

然后将其添加到您的实体中;例如

private java.util.Date originDate;

@XmlJavaTypeAdapter(DateAdapter.class)
@Column(name = "ORIGIN_DATE", nullable = true)
@XmlElement(namespace = "my-namespace")
public Date getOriginDate() {
    return this.originDate;
}

这是我曾经学习过的教程; http://weblogs.java.net/blog/kohsuke/archive/2005/04/xmladapter_in_j.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    相关资源
    最近更新 更多