我正在尝试使用JPA Query获取记录,JPA Query在WHERE子句中包含DATE和TIMESTAMP列。但不知何故,日期和时间戳列无法从数据库中检索任何内容。
代码段:
String sql = "Select F.* from FIN_TABLE F where F.COL1_NUM = :COL1 and F.COL2_TIMESTAMP =:COL2 and F.COL3_DATE =:COL3";
Query query = JPAentityManager.createNativeQuery(sql);
query.setParameter("COL1", 123);
//java.sql.Timestamp:2014-10-29 12:00:00.0
query.setParameter("COL2", new java.sql.Timestamp(new java.sql.Date(new SimpleDateFormat("MMM dd yyyy HH:mm:sssa").parse("OCT 29 2014 12:00:000AM").getTime()).getTime()));
//java.sql.Date:2014-10-29
query.setParameter("COL3", new java.sql.Date(new SimpleDateFormat("MMM dd yyyy HH:mm:sssa").parse("OCT 29 2014 12:00:000AM").getTime()));
List<FinTable> result = (List<FinTable>)query.getResultList();
Oracle中的数据是:
COL1_NUM COL2_TIMESTAMP COL3_DATE 123 29-OCT-14 12.00.00.000000000 AM 26-Nov-14 456 29-OCT-14 12.00.00.000000000 AM 26-Nov-14
我最初尝试使用EntityManager.find(Class,Object)检索结果,但它也失败了,所以我尝试使用createNativeQuery(),但也无法成功。 我的FinTable实体将这些列作为时间戳和日期。
请指教正确的方法。 :) 谢谢!!
答案 0 :(得分:6)
日期和日历参数值需要特殊方法才能指定它们所代表的内容,例如纯日期,纯时间或日期和时间的组合,详情请参阅日期和时间(时间)类型部分
例如,以下调用将Date对象作为纯日期(没有时间)传递:
query.setParameter("date", new java.util.Date(), TemporalType.DATE);
和时间戳
query.setParameter("date", new java.util.Date(), TemporalType.TIMESTAMP);
答案 1 :(得分:0)
感谢您的回复。 问题解决了。
我正确使用了DATE和TIMESTAMP对象。
50%的问题是使用SimpleDateFormat解析我在哪里提到了24小时格式(HH)和AM / PM,正确使用的解析器是......
“MMM dd yyyy hh :mm:sssa”// 2014年10月29日12:00:000AM
而不是......
“MMM dd yyyy HH :mm:sss a ”// 2014年10月29日00:00:000
剩下50%的问题是列COL3_DATE,它被错误地定义为DATE但最初是TIMESTAMP;将其更改为TIMESTAMP解决了问题。
但是,使用Date仍然是任何方法(java.sql.Date,带有Temporal.DATE的java.util.Date)的问题。
感谢您的贡献。 :)