我有一列註定要存放一個時間戳,它使用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。
這是困擾我,我接近放棄和使用本機查詢,但這感覺就像作弊!
可能是毫秒問題,請檢查它們在參數和數據庫值中的值。 – remigio
由於Oracle數據庫中的列類型是DATE,因此在那裏不存儲任何毫秒信息。毫秒信息存在於java.util.Date端,所以我檢查了(比較了Date.getTime())和我傳入的值,並且從我的實體獲得的值是相同的。仍然難住... – emilys