有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Oracle函数在通过JPQL调用时返回日期,但不返回时间

我有一个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的类型,我也会获得相同的行为

在调查这个问题的时候,我看到了这篇文章How to convert correctly an Oracle Date field into java.util.Date through JPA,但我不明白在我的例子中如何使用“addScalar”

任何帮助都将不胜感激,提前谢谢


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

    您使用的是哪家JPA提供商?EclipseLink应该自动处理这个问题