【发布时间】:2015-06-09 22:19:32
【问题描述】:
我正在尝试对涉及日期的 Oracle 数据库进行本机查询,但我没有得到任何东西。
我有一个包含许多行的表,并且我知道 oid=1234 的记录具有最新的 updatetimeutc 字段,其中 updatetimeutc 是一个日期字段。所以我做了以下事情:
Query query1 = entityManager.createNativeQuery("select updatetimeutc from TABLE where oid=1234");
List<Object[]> resultList = query1.getResultList();
Object[] os = resultList.get(0);
Date date = os[0];
Query query2 = entityManager.createNativeQuery("select oid, updatetimeutc from TABLE where updatetimeutc > :d");
query.setParameter("d", date);
resultList = query.getResultList();
此时,我期待 resultList.size() == 0,但事实并非如此。我得到了与 query1 相同的行返回给我。
有人可以解释为什么会发生这种情况或我做错了什么吗?
谢谢
【问题讨论】:
-
您的
Date是java.util.Date还是java.sql.Date?我的猜测是它是一个java.sql.Date,它将忽略Oracledate的时间组件。这会导致第二个查询将传入的参数视为相关日期的午夜,然后如果 Oracle 中的时间组件在午夜之后,则返回您最初查询的同一行。 -
似乎没有什么不同。我从第一个查询中取回了 java.sql.Date。如果我用 sql.Date 中的 .getTime() 构造一个 java.utl.Date,我会得到相同的结果。
-
如果您返回
java.sql.Date并将其打印出来,您会发现没有时间组件。如果您打印出存储在 Oracle 中的date值,我敢打赌它确实包含时间组件。如果您正在减少时间,那就解释了您所看到的行为。我怀疑您想通过ResultSet.getTimestamp从 Oracle 检索值。 -
因为我使用的是本机查询,所以我没有返回 ResultSet。我正在返回一个对象数组列表。还有什么其他方法可以从在 Oracle 数据库中触发的本机查询中获取日期字段??
-
不幸的是,我不是 JPA 专家。不过,我希望您希望从您的
resultList获得java.sql.Timestamp,而不是获得java.sql.Date。我用原始的 JDBC 术语来表达它只是因为那是我更熟悉的。