java - JPA CreateNativeQuery 返回错误的日期

标签 java mysql hibernate jpa localdate

我们最近将一个项目从使用 Hibernate 4 更新为 Hibernate 5.2,随之而来的是需要更新我们所有的标准以使用 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 控制台中运行查询时,我不明白为什么这与结果不匹配,看起来它们对我来说应该是一样的。

最佳答案

尝试另一个 JDBC 驱动程序

好的,我让它工作了。对于它的值(value),这对我来说似乎完全是疯狂的。 “啊哈!”阅读的时刻来了this answer to a different question.

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

关于java - JPA CreateNativeQuery 返回错误的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43526066/

相关文章:

java - 尝试检查内部存储中是否存在文件

java - 如何返回泛型方法?

java - 使用 facebook-java-api 的 Facebook 聊天应用程序

mysql - 平均行长比可能的长

hibernate - JPA多态关联多表

hibernate - Spring 数据修订存储库 : not returning onetomany when using getRevisions

java - 与 csv 文件相比,将 mysql 表转换为 spark 数据集非常慢

php - 在 CakePHP 中计算关联

mysql - 电影推荐引擎概念数据库设计

json - 无法初始化代理 - 无 session