【问题标题】:JPA CreateNativeQuery returns wrong dateJPA CreateNativeQuery 返回错误的日期
【发布时间】:2017-09-17 11:22:24
【问题描述】:

我们最近将一个项目从使用 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 控制台中运行查询时,我不明白为什么这与结果不匹配,似乎它们对我来说应该是一样的。

【问题讨论】:

  • 我认为这是由您的开发服务器和您的 mysql 服务器之间的时区差异引起的。
  • @arturo 我认为您可能是对的,但令我困惑的是,这在以前不是问题,只是在我更新库时才成为问题。

标签: java mysql hibernate jpa localdate


【解决方案1】:

尝试其他 JDBC 驱动程序

好的,我搞定了。对于它的价值,这对我来说似乎是完全的疯狂。 “啊哈!”阅读的时候到了this answer to a different question.

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

【讨论】:

  • 你能告诉我应该使用哪个 JDBC 驱动程序吗,拜托...现在我正在使用 com.mysql.cj.jdbc.Driver
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-27
  • 2013-11-08
  • 2013-09-04
  • 2018-04-05
  • 2016-09-26
  • 1970-01-01
相关资源
最近更新 更多