【问题标题】:Hibernate query returning wrong date休眠查询返回错误的日期
【发布时间】:2019-03-13 10:59:14
【问题描述】:

当我从 mysql 表中检索日期时,它总是返回 1 天前的日期,日期格式为 yyyy-MM-dd,所以如果我在打印结果时有 2018-10-17,它将作为 2018- 10-16。如果我使用命令行检查日期,它们是正确的。 这是 Dao 类中检索日期的方法:

public List<LocalDate> getDates(String username){
    List<LocalDate> dates;
    Query query = manager.createQuery("select date from Calendar where username =:username");
    query.setParameter("username",username);
    dates = query.getResultList();
    return dates;
}

当我打印列表时,所有日期都是在 1 天前打印出来的,就像我在我的 sql 上一样。

这就是我在 servlet 上获取日期并使用 hibernate 将日期存储在 mysql 上的方式。

String dateString = request.getParameter("date");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate dataInicial = LocalDate.parse(dataInicialString, formatter);

我在 mysql 中使用的数据类型是 DATE。 然后我用 hibernate 为我做剩下的事情,如果你需要任何我没有提供的代码,请问我。 提前谢谢。

抱歉英语不好!

【问题讨论】:

  • DateSimpleDateFormat 类已过时且设计不佳。较新的 Hibernate 应该能够从数据库中获取日期为 LocalDate,我强烈建议您这样做。它解决了您的问题,因为 LocalDate 既没有时间也没有时区。作为额外的奖励LocalDate 和 java.time 中的其他类使用起来要好得多。 java,time is the modern Java date and time API.
  • 如果您无法更改服务器的时区设置,您可以尝试按照其中一位维护者vladmihalcea.com/… 的说明更改 Hibernate 的设置
  • @OleV.V.我对代码进行了一些更改并更新了问题/帖子,我认为应该是这样,但它仍然是同样的问题,我在将其存储在 mysql ant 之前检查了日期,这是我拥有的日期,我使用了命令行来选择mysql中的日期,它们也是正确的,我使用mysql中的数据类型作为日期,我应该改变它吗?还是仍然需要修复一些代码错误?谢谢你的时间和回答。如果有任何错误,抱歉英语不好
  • 很抱歉没有达到预期的效果。恐怕我没有建议,但是您是否告诉我们 MySQL 中的数据类型,有人可能更容易帮助您?
  • @OleV.V.我找到了需要做的事情,我更改了 HQL 查询,我不知道为什么,但是当我从日历中执行 "Query query = manager.createQuery("select DATE_FORMAT(date,'%Y-%m-%d')其中用户名 =:用户名");"有用!!!!并且感谢 LocalDate 建议,使用起来更好!

标签: java mysql hibernate date simpledateformat


【解决方案1】:

我曾经遇到过这个问题,原因在于我的 MySQL 配置的默认时区。因此,首先通过以下查询检查您使用的时区。

SELECT @@global.time_zone;

如果不是所需的时区,请尝试进入您的 MySQL 配置文件并添加以下行。

[mysqld]
default-time-zone = '00:00'

记得将其设置为所需的时区。您需要重新启动 MySQL 才能进行更改。此更改将是永久性的。

【讨论】:

  • SELECT @@global.time_zone 返回 SYSTEM,怎么办??
【解决方案2】:

我找到了需要做的事情,我更改了 HQL 查询,我不知道确切原因,但是当我这样做时

Query query = manager.createQuery("select DATE_FORMAT(date,'%Y-%m-%d') from Calendar where username =:username");

有效!!!!

【讨论】:

  • 我也面临着与你完全相同的情况,但在我的情况下,我必须在选择查询中检索整行而不是仅检索日期,我该怎么办???请帮帮我...
猜你喜欢
  • 2013-08-30
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 2011-08-10
相关资源
最近更新 更多