由於Nor java.util.Date和java.util.Calendar的精確度都是微秒級,所以請不要將它們用作參數!
使用具有納秒精度的java.sql.Timestamp。在這種情況下,小心地設置納米領域上的時間戳 (java.sql.Timestamp way of storing NanoSeconds)
我創建了一個簡單的場景來進行測試:
CREATE TABLE precisetimes(id NUMBER(2), precisetime TIMESTAMP(6));
insert into precisetimes values(1, TO_TIMESTAMP('2017-05-31 12:12:12.123456','YYYY-MM-DD HH:MI:SS.FF'));
insert into precisetimes values(2, TO_TIMESTAMP('2017-05-31 12:12:12.12','YYYY-MM-DD HH:MI:SS.FF'));
insert into precisetimes values(3, TO_TIMESTAMP('2017-05-31 12:12:12.123457','YYYY-MM-DD HH:MI:SS.FF'));
commit;
select id,TO_CHAR(precisetime, 'YYYY-MM-DD HH:MI:SS.FF') ptime from precisetimes;
選擇所有:
ID PTIME
---------- -----------------------------
1 2017-05-31 12:12:12.123456
2 2017-05-31 12:12:12.120000
3 2017-05-31 12:12:12.123457
在此準備後,以下代碼:
TypedQuery<Precisetimes> q = entityManager.createQuery(
"select p from Precisetimes p where p.precisetime < :param",
Precisetimes.class);
Timestamp ts;
ts = Timestamp.valueOf("2017-05-31 12:12:12.123456");
q.setParameter("param", ts, TemporalType.TIMESTAMP);
System.out.println("result: " + q.getResultList());
ts = Timestamp.valueOf("2017-05-31 12:12:12.123457");
q.setParameter("param", ts, TemporalType.TIMESTAMP);
System.out.println("result: " + q.getResultList());
ts = Timestamp.valueOf("2017-05-31 12:12:12.123458");
q.setParameter("param", ts, TemporalType.TIMESTAMP);
System.out.println("result: " + q.getResultList());
有這樣的結果:
result: [id: 2, precisetime: 2017-05-31 12:12:12.12]
result: [id: 1, precisetime: 2017-05-31 12:12:12.123456, id: 2, precisetime: 2017-05-31 12:12:12.12]
result: [id: 1, precisetime: 2017-05-31 12:12:12.123456, id: 2, precisetime: 2017-05-31 12:12:12.12, id: 3, precisetime: 2017-05-31 12:12:12.123457]
我想這是你需要什麼?我上傳這裏的測試例子:http://peter.risko.hu/java_incubator/jpa_hibernate_oracle_precisetimestamp.zip
注意,有一個倒過來,通過TO_CHAR函數甲骨文時間戳轉換爲字符串在Select語句:
select id,TO_CHAR(precisetime, 'YYYY-MM-DD HH:MI:SS.FF') ptime from precisetimes
where TO_CHAR(precisetime, 'YYYY-MM-DD HH:MI:SS.FF') > '2017-05-31 12:12:12.123457';
結果:
ID PTIME
---------- -----------------------------
1 2017-05-31 12:12:12.123456
2 2017-05-31 12:12:12.120000
但爲此,您必須使用JPA的Criteria API或本機查詢,因爲JPQL不支持本機函數。在這種情況下,請注意在數據庫端和Java端使用相同的格式。
任何想法如何翻譯JPA中的TO_CHAR? –
Alagammal,對不起,我剛剛意識到您使用JPQL。您必須使用JPA的Criteria API或TO_CHAR的本機查詢。 JPQL不支持本機功能。 – riskop