0

我有一个 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变量包含正确的日期,但有一个 time = 00.00.000。即使使用java.util.Date而不是java.sql.Date, 作为retSql.

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

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

4

2 回答 2

2

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

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

于 2012-04-23T15:23:18.520 回答
0

使用 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

于 2012-05-01T12:07:46.960 回答