JPA CreateNativeQuery返回错误日期
问题描述:
我们最近更新了一个项目,从使用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控制台中运行查询时,我不明白为什么这不匹配结果,它看起来应该和我一样。
答
尝试另一个JDBC驱动程序
好的,我得到它的工作。对于它的价值,这似乎对我来说完全是疯狂的。 “啊!”在读的时刻就来了this answer to a different question.
由于它是mysql驱动程序,它规定了系统中日期的解析方式。我回滚了我的mysql驱动程序,因为那是我更新的软件包之一。突然间一切都如预期的那样。
我认为这是由你的开发服务器和你的mysql服务器之间的时区差异造成的。 – arturo
@arturo我认为你可能是对的,但是让我感到莫名其妙的是,这并不是一个问题,而只是在更新库时才成为一个问题。 –