2017-04-20 59 views
1

我們最近更新了一個項目,從使用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控制檯中運行查詢時,我不明白爲什麼這不匹配結果,它看起來應該和我一樣。

+1

我認爲這是由你的開發服務器和你的mysql服務器之間的時區差異造成的。 – arturo

+0

@arturo我認爲你可能是對的,但是讓我感到莫名其妙的是,這並不是一個問題,而只是在更新庫時才成爲一個問題。 –

回答

2

嘗試另一個JDBC驅動程序

好的,我得到它的工作。對於它的價值,這似乎對我來說完全是瘋狂的。 「啊!」在讀的時刻就來了this answer to a different question.

由於它是mysql驅動程序,它規定了系統中日期的解析方式。我回滾了我的mysql驅動程序,因爲那是我更新的軟件包之一。突然間一切都如預期的那樣。