1

我们最近将一个项目从使用 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 类型的问题,因为我尝试在我的开发服务器上打印出来,它还返回“2017-04-19”而不是 20 日。当我在 mysql 控制台中运行查询时,我不明白为什么这与结果不匹配,看来它们对我来说应该是一样的。

4

1 回答 1

2

尝试其他 JDBC 驱动程序

好的,我得到它的工作。对于它的价值,这对我来说似乎是完全的疯狂。“啊哈!” 在阅读另一个问题的答案时,时刻到了。

因为是 mysql 驱动程序决定了系统中日期的解析方式。我回滚了我的 mysql 驱动程序,因为那是我更新的软件包之一。突然间,一切都按预期进行。

于 2017-04-20T18:01:19.687 回答