我们最近更新了一个项目,从使用Hibernate 4到Hibernate 5.2,随之而来的是需要更新我们的所有Criteria才能使用JPA。在大多数情况下,事情处于正常工作状态,但我有一个不再表现的查询。我们查询的表中的一个字段是数据库中的DATE类型。
当我直接在桌子上查询时,我会回到日期 - 说它是" 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类型的一个问题,因为我尝试在我的开发服务器上打印出来并且它还返回&#34; 2017-04-19&#34;而不是20日。当我在mysql控制台中运行查询时,我不明白为什么这与结果不匹配,看起来它们应该和我一样。
答案 0 :(得分:2)
好的,我明白了。对于它的价值,这对我来说似乎是完全的疯狂。 &#34;啊哈!&#34;阅读this answer to a different question.
时刻因为它是mysql驱动程序,它指示如何在系统中解析日期。我回滚了我的mysql驱动程序,因为那是我更新的软件包之一。突然间,一切都表现得像预期的那样。