2012-04-23 25 views
0

我有一個Oracle函數,它接受除其他外的日期參數,並返回一個日期。功能是這樣的:Oracle函數返回日期,但沒有時間通過​​JPQL調用

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」。

任何幫助將不勝感激,在此先感謝。

+1

看來Java Date類沒有時間部分。嘗試聲明你的'now'變量作爲時間戳,看看是否能解決問題。 – 2012-04-23 11:47:51

回答

2

嘗試在函數中返回TIMESTAMP,而不是DATE。 DATE現在只是Oracle中的一個日期,並且TIMESTAMP假定用於日期/時間。您可以在JDBC中設置一個向後兼容標誌來控制此標誌。

您使用的是JPA提供程序? EclipseLink應該自動處理它。

+0

請注意,在這個域中的oracle和java之間的最佳匹配可以說是TIMESTAMP(3)和java.util.Date,因爲兩者具有相同的精度(高達毫秒)......如果你看到你得到java.sql 。執行期間的時間戳對象,小心!將Timestamp實例看作Date時可能會出現問題(請參閱javadoc http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/Timestamp.html中的介紹)) – 2012-04-23 16:25:40

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