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控制台中运行查询时,我不明白为什么这不匹配结果,它看起来应该和我一样。

+1

我认为这是由你的开发服务器和你的mysql服务器之间的时区差异造成的。 – arturo

+0

@arturo我认为你可能是对的,但是让我感到莫名其妙的是,这并不是一个问题,而只是在更新库时才成为一个问题。 –

尝试另一个JDBC驱动程序

好的,我得到它的工作。对于它的价值,这似乎对我来说完全是疯狂的。 “啊!”在读的时刻就来了this answer to a different question.

由于它是mysql驱动程序,它规定了系统中日期的解析方式。我回滚了我的mysql驱动程序,因为那是我更新的软件包之一。突然间一切都如预期的那样。