我們最近更新了一個項目,從使用Hibernate 4到Hibernate 5.2,並且因此需要更新所有的Criteria以使用JPA。大部分事情都是按照正常工作的順序進行的,但是我有一個不再表現的查詢。我們查詢的表格中的一個字段是數據庫中的DATE類型。JPA CreateNativeQuery返回錯誤日期
當我直接在桌上查詢時,我找回日期 - 說它是「2017-04-20」。但是,當我在我們的開發服務器上運行相同的查詢時,使用JPA的createNativeQuery,我得到日期「2017-04-19」
我不認爲這是查詢的問題,因爲我運行的確切同樣的查詢都通過mysql終端並通過java獲得不同的結果。我運行的查詢是在我下面的例子中記錄的。我認爲這可能是一個時區問題,因爲我的本地環境中沒有這個問題,只是在我的開發服務器上,但在我們更新到新版本的Hibernate之前,這也不是問題。
public List<ResponseDTO> getDashboardData(String date, Integer page, Integer pageSize, AbstractDashboard dashboard) {
List<ResponseDTO> processed = new ArrayList<ResponseDTO>();
String query = getDashboardQuery(date, dashboard);
logger.info("Dashboard Query: " + query);
List<Object[]> raw = createNativeQuery(query).getResultList();
return raw.stream().map(r->new ResponseDTO(r)).collect(Collectors.toList());
}
我的DTO對象的構造函數:
public ResponseDTO(Object[] r) {
this.date = ((Date) r[0]).toLocalDate();
System.out.println(this.date.toString());//This date does not match what is in the db.
this.type = (String) r[1];
this.label = (String) r[2];
this.value = (Double) r[3];
}
編輯:
我認爲它實際上是與java.sql.Date類型的問題,因爲我試過了上打印我的開發服務器,它也返回「2017-04-19」,而不是20日。當我在mysql控制檯中運行查詢時,我不明白爲什麼這不匹配結果,它看起來應該和我一樣。
我認爲這是由你的開發服務器和你的mysql服務器之間的時區差異造成的。 – arturo
@arturo我認爲你可能是對的,但是讓我感到莫名其妙的是,這並不是一個問題,而只是在更新庫時才成爲一個問題。 –