2012-12-12 63 views
5

我有一列註定要存放一個時間戳,它使用java.util.Date數據類型定義並存儲在數據庫的Oracle DATE類型中。我已驗證完整的日期和時間信息是從數據庫中持久保存和正確檢索的,但是當我嘗試在NamedQuery中比較它時,時間信息似乎在比較中未被考慮。JPA:NamedQuery中的時間戳比較:時間數據丟失

該柱被定義如下(analyzeDate是java.util.Date類型):

@Basic(optional = false) 
@Column(name = "ANALYZE_DATE") 
@Temporal(TemporalType.TIMESTAMP) 
private Date analyzeDate; 

而我NamedQuery:

@NamedQuery(name = "BOADocument.findByBeforeAnalyzeDate", 
    query = "SELECT b FROM BOADocument b WHERE b.companyId = :companyId AND b.analyzeDate < :analyzeDate") 

其中我然後執行,傳遞analyzeDate這是java.util.Date類型:

List<BOADocument> docs = em.createNamedQuery("BOADocument.findByBeforeAnalyzeDate") 
      .setParameter("companyId", clientRecord) 
      .setParameter("analyzeDate", analyzeDate, TemporalType.TIMESTAMP) 
      .getResultList() 

我找回所有行的列表中文件表,儘管它們的analyzeDate值與我爲NamedQuery設置的參數值完全相同。

如果我反過來比較,我沒有得到任何線條,進一步說服了時間戳的時間部分在事物的b.analyzeDate側而不是事物的analyzeDate側。

我使用JPA 1.0與Hibernate 3.5。

這是困擾我,我接近放棄和使用本機查詢,但這感覺就像作弊!

+0

可能是毫秒問題,請檢查它們在參數和數據庫值中的值。 – remigio

+0

由於Oracle數據庫中的列類型是DATE,因此在那裏不存儲任何毫秒信息。毫秒信息存在於java.util.Date端,所以我檢查了(比較了Date.getTime())和我傳入的值,並且從我的實體獲得的值是相同的。仍然難住... – emilys

回答

3

原來,底層甲骨文類型必須是TIMESTAMP。

當日持有小時,分鐘和秒的信息,這是足夠的精度爲我的目的,所以我打算使用它,而不是TIMESTAMP,亦持有毫秒。正如我前面提到的,存儲和檢索到和的小時,分​​鍾和秒鐘信息來自DATE的工作是完美的,但不是基於命名查詢中的時間數據進行比較。

我改變了數據庫的列類型和瞧,代碼像以前的書面作品。當然,我也可以節省毫秒,但是這不會在我的代碼中產生任何副作用。

1

修改查詢如下一個

SELECT b從BOADocument B其中b.companyId =:companyId AND CAST(b.analyzeDate AS時間戳)<:analyzeDate」

+0

這似乎是有道理的,但唉,這並沒有改變任何東西。我確實注意到這種情況很挑剔:時間戳必須小寫。雖然允許我看看如何使用CAST,但是! – emilys